我最近开始使用Zend Framework,我完全爱上了它,我甚至退出了我自己的框架,支持它。
但是我错过了一些可能非常痛苦的东西,你会轻笑一下。
我有一个登录系统,在每个控制器中我必须检查登录状态,我看看在Bootstrap中访问Zend会话存储但是我有点截止日期并且买不起浪费时间,是否有更好的方法来检查引导程序中的IE?而不是在每个控制器中重复20行以上的代码和功能。
提前致谢!
答案 0 :(得分:4)
您可以使用控制器插件。请参阅:http://framework.zend.com/manual/en/zend.controller.plugins.html
class Your_Plugin_Login extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
if (!Zend_Auth::getInstance()->hasIdentity()) {
// send the user to the login page
$request->setControllerName('login')
->setActionName('login');
}
}
}
将控制器/操作名称替换为适合您的登录页面的内容,将“Your”替换为您的应用程序命名空间。
然后,您可以在application.ini或带有Zend_Controller_Front::getInstance()->registerPlugin(new Your_Plugin_Login());
的引导程序中使用Front控制器注册插件。
修改:如果您还想在视图中添加用户详细信息,您可以执行以下操作:
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->user = Zend_Auth::getIdentity();
答案 1 :(得分:1)
你可以编写自己的继承自Zend Controller的控制器(称之为DaveMac_Controller - 你可以在应用程序的配置文件中定义前缀,以便应用程序可以自动加载它(你需要小心保存你的目录)上课))。在此类的构造函数中运行检查以进行身份验证。然后将所有页面的控制器更改为继承自DaveMac_Controller而不是默认的zend控制器。
如果我在家,我可以复制并粘贴一些代码作为示例,但现在正在工作,所以希望上面的大纲就足够了。
*编辑好的'dropbox:)
的application.ini
includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces[] = "DaveMac_"
/../库/ DaveMac /控制器/ action.php的
<?php
class DaveMac_Controller_Action extends Zend_Controller_Action {
protected $acl;
protected $user;
protected $userRole;
public function init() {
//retrieve and store user details
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity()){
$user = $auth->getIdentity();
$this->user = $user;
$this->view->user = $user;
$this->userRole = $user->role;
} else {
$this->userRole = "guest";
}
//Initialise access control list
$this->acl = new DaveMac_Acl();
}
protected function checkAuth($pageLevel, $redirect = "/") {
if($this->user) {
if(!$this->acl->isAllowed($this->userRole, $pageLevel)) {
$this->_redirect($redirect);
}
} else if ($pageLevel != DaveMac_Resources::PUBLIC_ONLY_PAGE) {
$this->_redirect('/login/returnurl/' . str_replace('/','-',$this->getRequest()->getRequestUri()));
}
}
}
你可能已经有了自己的功能来检查身份验证,但我还是认为我会离开我的