我有一个Zend项目,使用方法有很多控制器和操作
$this->_redirect('/controller_name/action_name');
用于在数据处理之后重定向到其他动作。我观察到,这会产生很多"魔术串",损害DRY原则:如果我更改控制器或操作名称,我必须在所有使用它的操作中更改此重定向代码。我想知道Zend中是否有更好的方法来避免这种情况。我考虑过为所有控制器和动作名称创建常量,比如:
$this->_redirect(HOME_CONTROLLER_INDEX);
但我认为这种方法不是很好。有更好的解决方案吗?
您可以使用const代替
class DefaultController extends Zend_Controller_Action {
const IndexAction = '/controller/action/';
...
$this->_redirect(DefaultController::IndexAction);
}
或SplEnum。请参阅:http://www.php.net/manual/de/class.splenum.php
如果您不打算修改路由器(因为您使用的是"已编译"的url),那么定义常量的选项是可行的。
$this->_redirect('/controller/action');
否则,您可以依赖于一些调用redirector
操作助手的私有方法。
public function redirectControllerAction()
{
$this->_helper->redirector('action', 'controller');
}
通过这种方式,您可以在controllers
中本地化所有重定向。
如果你将来必须维护你的代码,你可以将所有具体的重定向分组在一起,这样你就不会用很多常量来混淆代码,这些常量可能会阻碍可读性并使维护变得复杂。
您也可以使用控制器方法,使用flash信使向用户发送消息,而无需付出太多努力。
public function redirectControllerAction()
{
$this->_helper->flashMessenger('You have been redirected to a better location');
$this->_helper->redirector('action', 'controller');
}
对于目标控制器名称,您可以添加以下静态方法:
public static function getName() { return __CLASS__; }
(您需要添加代码来删除控制器后缀,并调用Zend_Filter_Word_xxx来执行拐点)
并像这样使用:
$this->_redirect('/'.DefaultController::getName().'/action_name');