2015-12-27

Phalconあれこれ2

phpのWebアプリケーションフレームワークphalconのあれこれ第二弾。バージョンは2系です。

エラー時のログについて

基本EventManagerのbeforeExceptionのハンドラ仕込んだり、色々とログを出力させるのが良いと思いますが、予期せぬエラー系のものは以下のような感じでエラー内容を確認できます。

スニペットレベルの動作確認

簡単なスニペットレベルでの動作確認はコマンドラインアプリケーションを作って確認するのが楽です。 メインのタスククラスとかアクションをこんな感じで作ってあげて
<?php

class MainTask extends \Phalcon\CLI\Task
{
    public function mainAction()
    {
        var_dump(Hoge::find());
    }
}

こんな感じで実行すればOK。

$ php app/cli.php

getHandlerClassとgetActionNameの挙動

HogeControllerのfugaActionを実行した場合のfugaAction内で実行したgetHandlerClass、getActionNameの挙動は以下のようになります。
//1. Sharedなrouterを呼び出す
$this->router->getHandlerClass(); // HogeController
$this->router->getActionName(); // fuga
 
//2. Sharedなdispatcherを暗黙的に呼び出す(getDIじゃないショートカットを利用)
$this->dispatcher->getHandlerClass(); // HogeController
$this->dispatcher->getActionName(); // fuga
 
//3. Sharedなdispatcherを明示的に呼び出す
$this->getDI()->getShared('dispatcher')->getHandlerClass(); // HogeController
$this->getDI()->getShared('dispatcher')->getActionName(); // fuga
 
//4. Sharedじゃないdispatcherを呼び出す
$this->getDI()->get('dispatcher')->getHandlerClass(); // IndexController
$this->getDI()->get('dispatcher')->getActionName(); // null
 
//5. 同一インスタンスの新規dispatcherに対してdispatcherを呼び出す
$dispatcher = $this->getDI()->get('dispatcher');
$dispatcher->getHandlerClass(); //IndexController
$dispatcher->getActionName(); //index

1はrouterのメソッド呼び出しで、dispatch後ではない為、初回のルーティング、つまりURLに応じたコントローラ、アクション名が入る。dispatchが複数回行われてもこの値が変わることは無い。

2, 3はSharedなdispatcherを呼び出していて、現在のdispatch先のコントローラ、アクション名が取得される。

4, 5はSharedではなく新規にインスタンスを作成しているパターン。4では2回インスタンス化され、getHandlerClassが呼び出されると初期値としてコントローラにIndexController、アクションにindexが割り当てられるので、4と5は異なる結果になっている(5は同一インスタンスに対してなので初期化された値が反映されている)

RequestクラスのgetQueryとgetについて

RequestクラスのgetQueryメソッドは$_GET、getメソッドは$_REQUESTを見ています。
$this->request->getQuery('hoge') // $_GET['hoge']
$this->request->get('hoge') // $_REQUEST['hoge']

codeceptionのRequestクラスは$_REQUESTと$_GETの両方に入れているので特に気にしなくてOKですが、phalcon/incubatorの方は自前でテストリクエストを実装することになるので注意が必要。

スキーマもモデルクラスも更新したのに反映されない

メタデータが更新されていないことに起因します。メタデータのキャッシュ先をファイルにしている場合は、メタデータのファイルを削除すればOK。 反映されないと以下の様な「そんな項目ありません」エラーが出ます。
Column 'hoge' doesn't belong to any of the selected models
このエントリーをはてなブックマークに追加