phalcon beforeExecuteRoute 處理需要 session 與 public api 的 access control

phalcon 的架構中,所有的 controller 預設是繼承 ControllerBase (app/controller/ControllerBase.php) 而來,而所有的 request route 都會先經過 beforeExecuteRoute。所以,如果要把 Web UI 登入後所有操作都要檢查 session id, 而且系統同時提供 api 供其他 application 使用,那這樣就可以在 ControllerBase 中實作 beforeExecuteRoute 做檢查。

檢查的時候可以透過 route 物件的 getControllerName(), getActionName(), getParams() 來取得 request 的相關資訊。

<?php

use Phalcon\Mvc\Controller;

class ControllerBase extends Controller
{
  public function beforeExecuteRoute(\Phalcon\Mvc\Dispatcher $dispatcher)
  {
        if ( ($this->router->getControllerName() == "assets" && $this->router->getActionName() == "apisearch") || 
             ($this->router->getControllerName() == "assets" && $this->router->getActionName() == "apifacetedsearchbycategories") || 
             ($this->router->getControllerName() == "glass" && $this->router->getActionName() == "apisearch") 
           )
        {
            return;
        }
        else
        {
            if ($this->session->has("permission"))
            {
                // nothing
            }
            else
            {
            	return $this->response->redirect("login/index");
            }
        }
    }
}

當然,如果把所有的 api 通通放到一個單獨的 controller,這樣要檢查的規則最簡單明瞭。