一种方法,虽然很麻烦,但是使用controlerName/index.volt 作为“登陆页面”,然后从那里检查一个 if 语句来决定用户的角色是什么。然后从 if 语句中使用像 {{ partial("index.1.volt") }} 这样的部分,但你需要为每个控制器硬编码......哎呀......
不过,我推荐的一个好的解决方案是使用视图的exists 方法来检查视图是否存在于您的控制器中。这个想法是您将此方法传递给您正在寻找的视图文件的字符串路径,但省略扩展名。您省略扩展的原因是因为 Phalcon 允许您使用多个渲染引擎,因此使用 .volt 和 .phtml 混合的应用程序可以工作。
假设您使用的是这样的用户角色:
define('GUEST_ROLE',0);
define('ADMIN_ROLE',1);
define('ACCOUNTANT_ROLE',2);
define('WAREHOUSE_ROLE',3);
(guest 角色的值为 0)我建议让所有控制器扩展 ControllerBase,然后在 ControllerBase 中定义以下两种方法:
public function getUserLevel()
{
if($this->session->has('userLevel'))
{
$userLevel=$this->session->get('userLevel');
return (int)$userLevel;
}else{
return 0;//default to guest
}
}
protected function initialize()
{
$controllerName=$this->dispatcher->getControllerName();
$actionName=$this->dispatcher->getActionName();
$userLevel=$this->getUserLevel();
if($this->view->exists("$controllerName/$actionName.$userLevel"))
{
$this->view->pick("$controllerName/$actionName.$userLevel");
}
//No reason to add an else, Phalcon defaults to "$controllerName/$actionName"
}
只要确保,如果您需要为扩展 ControllerBase 的特定控制器定义自定义“初始化”方法,例如为与控制器相关的所有页面添加标题前缀,您可以调用 parent::initialize(); 否则它不会被调用。但这仅在您要覆盖该方法的情况下。
您可能已经在使用 ControllerBase 并且已经在执行类似的逻辑,如果是这样,您需要编辑您已经存在的“初始化”方法并将我的代码与您的合并。
编码愉快。