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