VirtualBox上のDebianで解像度を変更する
普通にインストールした状態だと,解像度の変更ができなかった(そもそもプルダウンに選択肢がなかった)ので,ググってみた.
tp://d.hatena.ne.jp/a-ya_diary/20090308/1236524901
tp://d.hatena.ne.jp/hipuri/20080513/1210682649
tp://d.hatena.ne.jp/ksaito11/20090217
ありがとうございます.なんとかなりました.
Zend_Rest_Serverについて
ZendFrameworkについてがっつりいろいろやったんだけど,書くのが面倒で更新が滞ってましたが,落ち着いてきたので少し記事を書いていきたいと思います.
まずは,xmlを返すようなシステムを作るために使ったZend_Rest_Serverについて.Content-Typeとかも勝手にtext/xmlにしてくれるので便利なんですが,公式のドキュメント読んでも意味がわからなくてかなり悪戦苦闘しました.(公式:http://framework.zend.com/manual/ja/zend.rest.server.html)
書いてる通りやってるのに動かない.どうなってんのって感じだった.だから一生懸命ググったんだけど,ググれどもググれども,いい資料が見つからない.最後は,海外のフォーラムをさまよって,やっとわかりやすいサンプルをみつけることができた.(http://blog.ekini.net/2009/04/17/zend-framework-a-simple-zend_rest_server-example/)
以下,http://localhost/zend/123のような感じでアクセスを想定したプログラム.123はidとしてルーティングしてあります.
//indexAction $params = $this->_getAllParams(); $request = 省略...; $server = new Zend_Rest_Server(); $server->setClass('XmlServer'); $server->handle($request); //XmlServer.php class XmlServer { private $xmlString = '<?xml version="1.0" encoding="UTF-8"?><response></response>'; public function getById($id) { $xml = new SimpleXMLElement($this->xmlString); //ノード追加処理は省略 return $xml; } }
受け取ったパラーメタを上のサイトにあるように
Array ( [method] => getById [id] => 123 )
のような配列にして$requestを作成.この配列のmethodの部分がsetClassで指定したクラスでよばれることになるようです.さらに,残りのパラメータ(ここでは[id] => 123)の値がそのメソッドの引数として渡されます.受け取る側は,
getById($id)
のようにして受け取ることができます.また,$requestのパラメータが↓こんなかんじで複数あるときは,
Array ( [method] => getById [id] => 123 [name] => hogeo )
getById($id, $name)
のようにして受け取ることになります.パラメータの数に合わせて良しなにやってくれるので楽でいいです.存在しないメソッドを呼んだときのエラー処理とかもやってくれます.
ルーティング
- http://framework.zend.com/manual/ja/zend.controller.router.html
- http://codezine.jp/article/detail/2226?p=2
この二つ読んだら出来た.
<?php //index.php $front = Zend_Controller_Front::getInstance(); $router=$front->getRouter(); $router->addRoute( 'test_router', new Zend_Controller_Router_Route( 'test/:id', //ルートの定義 array( //デフォルト値 'controller' => 'test', 'action' => 'index', 'id' => '000' ), array(id' => '\d+') )); Zend_Controller_Front::run('./application/controllers'); ?>
<?php //TestController.phpのindexAction public function indexAction() { $this->view->assign('id', $this->_getParam('id')); } ?>
<?php //view:index.phtml echo $this->escape($this->id); ?>
これで,「http://localhost/test/123」でアクセスすると123って表示される.
さあやるぞと思ったら
データベースの設計とかの勉強してなかったから,詰まった.
http://gihyo.jp/dev/feature/01/database/0001
これ読んで基本的なこと見てからやる.
ErrorController
とりあえずやり方はわかった.
でも,Viewについての理解が中途半端なのでうまく表示できない.
出来たらまとめる.
とりあえず
Zend_Controller_Plugin_ErrorHandlerの項を参考に,一番簡単な記述の↓を使います.
<? //index.php require_once 'Zend/Controller/Front.php'; require_once 'Zend/Controller/Plugin/ErrorHandler.php'; $front = Zend_Controller_Front::getInstance(); $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler()); Zend_Controller_Front::run('./application/controllers'); ?>
MVC での例外にある,__call(マジックメソッド?)を使ってもいいだけど,まだ理解してないのでパス(また今度勉強します).
ErrorControllerはサンプルを参考に
<? require_once 'Zend/Controller/Action.php'; class ErrorController extends Zend_Controller_Action { public function indexAction() { } public function errorAction() { $this->_helper->viewRenderer->setNoRender(); $errors = $this->_getParam('error_handler'); switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: // 404 エラー -- コントローラあるいはアクションが見つかりません $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found'); $content = "not found."; break; default: // アプリケーションのエラー $content = "error."; break; } // 前回の内容を消去します $this->getResponse()->clearBody(); $this->getResponse()->setBody($content); } } ?>
こんな感じに.わざわざviewのファイル作るほど内容がないので(1行しかない),レスポンスオブジェクトを使って出力してやります.
自動レンダリングをONにしてるとindex.phtmlやerror.phtmlを表示してしまうので「$this->_helper->viewRenderer->setNoRender();」を追加して自動レンダリングをOFFにします(これでこのアクションでだけOFFになる).
とりあずこれで.詳しくは追々勉強しよう.
存在しないページ or アクションを呼んだときの処理
ZendFrameworkで存在しないページのURLを開こうとしたときとか,存在しないアクションを呼んだときの対処法を明日調べる.
なんか今,エラーメッセージが丸見えの状態なだけだからなあ.