March 21, 2014

Phalconでルーティングをフィルタする

例えば、このコントローラのこのアクションは、Ajaxでしかアクセスさせたくない。という場合に、ルーティングでチェックできます。
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