如何避免Zend重定向方法中的字符串重复


How to avoid string repetition in Zend redirect methods?

我有一个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');