![](/img/trans.png)
[英]How do I reuse and override controller actions across two modules in Zend Framework
[英]How do I reuse code in Zend Framework
我正在开发一个Web应用程序,该应用程序要求用户先登录才能看到或执行任何操作。 如果未登录,则无法访问该应用程序的任何部分。(当然,登录控制器除外)
当前,我正在使用会话来处理身份验证,并且已将代码放在init()函数的每个控制器中,以检查其会话是否有效。
这是暂时的解决方法,但它是多余的且效率低下。
我希望我的init()函数类似于以下内容,但是我不确定如何实现:
public function init()
{
// If user not logged in redirect to login controller
$myLibrary = Zend_Library_MyLibrary();
$myLibrary->CheckAuth();
}
所以我的问题确实包含两个部分:
谢谢。
http://zendframework.com/manual/en/zend.controller.plugins.html
注册前端控制器插件并连接到调度过程的较早部分是我的方法。
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_AuthCheck());
将其放在您的index.php中。
class AuthCheck extends Zend_Controller_Plugin_Abstract {
public function preDispatch($request){
// Check Auth
}
}
最好将跨多个控制器重用的代码放入ActionHelper中 。 但是,对于您的情况,我建议编写一个Controller插件 。 这些在各个阶段都参与了Dispatch流程 :
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
if(!Zend_Auth::getInstance()->hasIdentity())
{
$request->setControllerName('auth');
$request->setActionName('login');
// Set the module if you need to as well.
}
}
以上假设您正在使用Zend_Auth
来验证和管理用户身份 。
您需要一个通过助手的插件,因为检查用户是否已登录应该自动进行,而无需在某个地方调用checkAuth()
方法。 当然,也没有什么可以阻止您添加ActionHelper的,例如
class My_Helper_CheckAuth extends Zend_Controller_Action_Helper_Abstract
{
public function checkAuth()
{
return Zend_Auth::getInstance()->hasIdentity();
}
public function direct()
{
return $this->checkAuth();
}
}
在引导程序中注册了助手之后,可以在每个控制器中使用它来检查用户是否已通过身份验证:
if ( $this->_helper->checkAuth() === FALSE) {
// do something
}
另请参阅以下教程:
虽然,对于这个特定示例,最好的选择是(可能)使用前端控制器插件,但是您也可以通过扩展Zend_Controller_Action
来重用代码。 如果您一直在使用Zend_Auth,则下面是一个人为的示例。 这将在library/Application/Controller
并命名为Action.php
。 如果您使用其他名称空间,则应交换该应用程序目录的名称(库/ [名称空间] /Controller/Action.php),并相应地重命名该类。
class Application_Controller_Action extends Zend_Controller_Action
{
protected $_loggedIn;
protected $_username;
protected $_flashMessenger = null;
public function init()
{
$auth = Zend_Auth::getInstance();
$this->_loggedIn = $auth->hasIdentity();
if($this->_loggedIn)
{
$user = $auth->getIdentity();
$this->_username = $this->view->escape($user->username);
}
$this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
$this->initView();
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.