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

时间:2012-01-11 13:27:37

标签: php zend-framework refactoring

我有一个Zend项目,其中包含许多使用方法

的控制器和操作
$this->_redirect('/controller_name/action_name');

用于在数据处理后重定向到其他操作。我发现这会产生很多“魔术字符串”,这会破坏DRY原则:如果我更改控制器或操作名称,我必须在使用它的所有操作中更改此重定向代码。我想知道Zend是否有更好的方法来避免这种情况。我已经考虑过为所有控制器和动作名称创建常量,如下所示:

$this->_redirect(HOME_CONTROLLER_INDEX);

但我认为这种做法并不是很好。有更好的解决方案吗?

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

如果您不打算修改路由器(因为您使用的是“已编译”的URL),那么定义常量的选项将是可行的。

$this->_redirect('/controller/action');

否则,您可以依赖一些调用redirector动作助手的私有方法。

public function redirectControllerAction()
{
    $this->_helper->redirector('action', 'controller');
}

通过这种方式,您可以在controllers

中对所有重定向进行本地化

如果您将来必须维护您的代码,那么您将所有细节重定向组合在一起,并且您不会使用可能妨碍可读性并使维护变得复杂的许多常量来填充您的代码。

您还可以使用控制器方法使用flash messenger向用户发送消息,而无需花费太多精力。

public function redirectControllerAction()
{
    $this->_helper->flashMessenger('You have been redirected to a better location');
    $this->_helper->redirector('action', 'controller');
}

答案 2 :(得分:0)

对于目标控制器名称,您可以添加以下静态方法:

public static function getName() { return __CLASS__; } 

(您需要添加代码以删除控制器后缀并调用Zend_Filter_Word_xxx来执行变形)

并像这样使用它:

$this->_redirect('/'.DefaultController::getName().'/action_name');