phpのWebアプリケーションフレームワークphalconのあれこれ第二弾。バージョンは2系です。
エラー時のログについて
基本EventManagerのbeforeExceptionのハンドラ仕込んだり、色々とログを出力させるのが良いと思いますが、予期せぬエラー系のものは以下のような感じでエラー内容を確認できます。- syntaxエラーや存在しないクラス、メソッド呼び出し等に起因するInternalServerErrorの場合は、Webサーバのエラーログを見れば確認可能。
- 存在しないカラムを使ってデータを取得しようとした場合はExceptionが発生するので、dispatcher:beforeExceptionのハンドラを仕込んでExceptionの内容を見れば確認可能。
- phqlやモデルのメソッド使ってうまく取得できない場合は、DB側の設定で発行されたSQLのログを取るか、プロファイラ使って発行された実SQLを見てみる。
スニペットレベルの動作確認
簡単なスニペットレベルでの動作確認はコマンドラインアプリケーションを作って確認するのが楽です。 メインのタスククラスとかアクションをこんな感じで作ってあげて<?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