http://docs.phalconphp.com/en/1.2.6/reference/routing.html#match-callbacks
まず、フィルタクラスを作成します。尚、di()という関数が書いてありますが、この後に書くユニットテスト関係になります。(書きました。 http://madroom-project.blogspot.jp/2014/03/phalcon_22.html )
<?php namespace Core\Filter;
/**
* Class AjaxFilter
*/
class AjaxFilter
{
/**
* @var \Phalcon\Http\Request
*/
protected $request;
/**
* constructor
*/
public function __construct()
{
$this->request = di()->get('request');
}
/**
* @return bool
*/
public function filter()
{
return $this->request->getServer('X_REQUESTED_WITH') === 'xmlhttprequest';
}
}
ルーティングで、以下のようにします。AjaxFilter#filter()の戻り値(bool)で、このルーティングにマッチするかしないかが決まります。beforeMatch()はチェインもできるようです。
$router->add('/', 'Index::index')->beforeMatch([new Core\Filter\AjaxFilter, 'filter']);
要認証の基底コントローラ、要Ajaxの基底コントローラ。とかを作ってコンストラクタで制御する手段もありますが、その場合、要認証かつ要Ajaxとかなってくると、ややこしくなるので、こんな感じが良いのかなと思いました。追記: Phalcon\Mvc\Controllerのコンストラクタはどういうわけか final になっていました。また、beforeMatch()をチェインした時、一方しか働かないような挙動になりました。(まだ細かくは見ていませんが。)
次はこのフィルタクラスをテストしてみます。
No comments:
Post a Comment