【问题标题】:Zend Controller preDispatch preprocessing interfering with dispatchZend Controller preDispatch 预处理干扰调度
【发布时间】:2012-01-20 05:34:16
【问题描述】:

我已将在控制器操作顶部重复的一些常见行为重构为 preDispatch 方法 - 这很好,除了我不得不忍受一般的 400 错误,即使确实应该有 404。

这是因为默认的 preDispatch 方法不知道需要什么 Action - 所以我无法测试它是否存在,如果不存在则 404。

除了完全使用 Zend Controller 的 dispatch() 方法并将 Action 名称传递给 preDispatch - 还有更好的解决方案吗?

更新:请注意,这是 Zend Framework 1.10

【问题讨论】:

  • 你有可用的请求对象,所以你可以自己检查
  • 在下面引用我自己的评论:'动作名称与动作''方法''名称不同'
  • 什么是动作“方法”名称?您正在执行一些重定向或在您的操作中调用其他对象?
  • 请求对象的 getActionName 方法返回带连字符的操作名称(因为这是我们定义 URL 的方式)——这是由调度程序格式化以获取方法名称(驼峰式)——据我所知可以看出,这些调度程序格式方法不适用于控制器或请求对象(至少,在不破坏封装的情况下)

标签: php zend-framework


【解决方案1】:

试试这样的:

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $front = Zend_Controller_Front::getInstance();
    if( $front->getDispatcher()->isDispatchable($request) )  {
        // if dispatchable do some stuff
    } else {
        // else show the error
    }
}

【讨论】:

  • 我认为我需要使用控制器的其他部分才能使其正常工作 - 但这似乎是正确的一步。
【解决方案2】:

。 . .默认的 preDispatch 方法不知道 Action 是什么 必需的 。 . .

您可以通过在请求对象上调用以下方法来获取preDispatch()方法中的控制器和动作名称:

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $controller = $request->getControllerName();
    $action = $request->getActionName();
    // Do stuff
}

【讨论】:

  • 啊-但是动作名称与动作''method''名称不同-我尝试了这条路线,最后从 Dispatcher 类中复制了大量代码以获取之前的方法名称意识到我只是在走向复制面食混乱
猜你喜欢
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2020-10-21
相关资源
最近更新 更多