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,這樣要檢查的規則最簡單明瞭。