我是一个PHP/Kohana应用程序开发的新手。
在我正在开发的web应用程序中,每当一个新的请求来到控制器时,我都需要检查用户是否已登录,或者他是否有足够的权限来提交他所请求的操作。由于我的应用程序具有不同类别的成员(具有不同的权限程度),因此每个控制器方法最终都具有大量if/else分支。该代码在其他控制器方法中也会重复。
是否有任何建议的方法来集中这些调用并避免代码重复?我的意思是唯一的方法来实现这一点,通过编写一个方法来包含所有的用户会话代码?还是我遗漏了任何已经处理这种情况的PHP/Kohana的功能?
如:-
if (Auth::instance()->logged_in('commentator')) {
// do something here.
}
else if (Auth:instance()->logged_in('admin')){
// do something here.
}
else if (Auth:instance()->logged_in('reviewer')){
// do something here.
}
创建一个名为Controller_Authenticated
的控制器,代码如下:
protected $login_level;
public function before()
{
parent::before();
if (Auth::instance()->logged_in('commentator')) {
$this->login_level = 'commentator';
}
elseif (Auth:instance()->logged_in('admin')){
$this->login_level = 'admin';
}
elseif (Auth:instance()->logged_in('reviewer')){
$this->login_level = 'reviewer';
}
else {
// Redirect to login page here, or display a "you are not logged in" message
}
}
然后,让您的其他控制器扩展Controller_Authenticated
而不仅仅是Controller
。然后您可以检查parent::$login_level
的值,看看这是哪种用户。
这样,所有的登录检查代码都在一个地方,并且在控制器加载时(在动作被调用之前)自动完成对用户类型的检查。
Kohana文档几乎完全有这个使用before
方法处理登录内容的示例。