php - 我可以在 init() 方法中取消 Zend Controller 操作吗?

标签 php model-view-controller zend-framework controller

Zend_Controller_Action::init() 期间,有没有办法取消操作(这样它就不会被调用)?

<?php
class JsonApiController extends Zend_Controller_Action {
    function init()
    {
        // try JSON decoding the raw request body
        if ($jsonDecodingFailed) {
            echo '{"error":"invalid JSON"}';
            $this->_cancelAction(); // something like this exist?
        }
    }
}

我目前的解决方法是制作一个空的 nullAction() 方法并调用 $this->_forward('null') 转发给它。

最佳答案

在 init() 中使用 $this->_forward() 没有错(如果你想转发到的方法与 init() 在同一个 Controller 中),这只会改变请求对象的 Controller /操作(覆盖通过路由器设置的内容)。

另一种方法是创建一个 Zend_Controller_Plugin,因为它看起来像是在处理意外错误。 查看 Zend_Controller_Plugin_ErrorHandler 实现。 因此,您不会转发到另一个操作,而是抛出一个异常,并让您的自定义插件检查 postDispatch() 是否响应包含任何期望,如果它只是编辑当前 Request 对象以显示您的“取消”操作。

$request->setDispatched(false)
        ->setControllerName("error")
        ->setActionName("jsonDecoding");

最后一种方法可能是在 echo "{error: "invalid json"}"之后抛出一个 exit 不是很好但是你会避免有另一个调度迭代的过载。

关于php - 我可以在 init() 方法中取消 Zend Controller 操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3971043/

相关文章:

php - 使用 Zend_Pdf 时出现 PDF 文档错误

php - 正确的用户名和密码对 PHP 没有任何影响

php - 使用 MySQL 和 session 登录

java - 如何配置mvc spring bean Controller 的属性?

php - 这个 MVC Controller 代码是否需要重构?

c# - ASP.net MVC 获取从 url 检索到的特定 id 的用户角色

php - ZendFramework - 如何从 Controller 添加 ->HeadScript()?

php - 在 Zend Form Select 中使用 HTML 实体

javascript - ckeditor - 不在textarea内设置html数据

php - 将 PHP id 传递给 jQuery 函数