5

我有可以被阻止的成员,当成员被阻止时,我想将他们发送到自定义错误页面,我将如何在 zend 框架中执行此操作?我试过

throw new Zend_Controller_Dispatcher_Exception('Your message here');

但是当我这样做时,它并没有说“您的消息”,而是说“找不到页面”。

这是我的错误控制器。

<?php

class ErrorController extends Zend_Controller_Action
{

public function errorAction()
{
    $errors = $this->_getParam('error_handler');

    switch ($errors->type) {
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

            // 404 error -- controller or action not found
            $this->getResponse()->setHttpResponseCode(404);
            $this->view->message = 'Page not found';
            break;

            // 666 error -- controller or action not found
            $this->getResponse()->setHttpResponseCode(666);
            $this->view->message = 'Blocked';
            break;
        default:
            // application error
            $this->getResponse()->setHttpResponseCode(500);
            $this->view->message = 'Application error';
            break;
    }

    // Log exception, if logger available
    if ($log = $this->getLog()) {
        $log->crit($this->view->message, $errors->exception);
    }

    // conditionally display exceptions
    if ($this->getInvokeArg('displayExceptions') == true) {
        $this->view->exception = $errors->exception;
    }

    $this->view->request   = $errors->request;
}

public function getLog()
{
    $bootstrap = $this->getInvokeArg('bootstrap');
    if (!$bootstrap->hasPluginResource('Log')) {
        return false;
    }
    $log = $bootstrap->getResource('Log');
    return $log;
}

}

这是文档, http: //framework.zend.com/manual/en/zend.exception.using.html我不明白:(

4

2 回答 2

8

这里有一些关于使它工作的建议。

首先,您需要将您的错误与标准no_route/no_controller/no_action错误区分开来。为此,您可以抛出自己的自定义异常(您可以从 PHP 的Exception类扩展它。

throw new My_Exception_Blocked('You are blocked');

然后,将错误控制器修改为如下所示:

public function errorAction()
{
    $errors = $this->_getParam('error_handler');

    switch ($errors->type) {
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

            // 404 error -- controller or action not found
            $this->getResponse()->setHttpResponseCode(404);
            $this->view->message = 'Page not found';
            break;

        // check for any other exception
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER:
            if ($errors->exception instanceof My_Exception_Blocked) {
                $this->getResponse()->setHttpResponseCode(403);
                $this->view->message = $errors->exception->getMessage();
                break;
            }
            // fall through if not of type My_Exception_Blocked

        default:
            // application error
            $this->getResponse()->setHttpResponseCode(500);
            $this->view->message = 'Application error';
            break;
    }
}

我还将响应代码从 更改666为 ,403因为没有6xxHTTP 错误代码,这可能会扰乱服务器和/或客户端。

希望有帮助。

于 2012-06-28T23:14:12.217 回答
5

您不应该使用错误控制器插件来管理程序错误。我建议将用户重定向到一个控制器,他们将在其中看到所需的消息。Zend Framework 中的错误控制器实现过于复杂。您可以通过重定向轻松解决问题。

也不鼓励使用错误控制器来处理程序错误。文档中的详细信息如下。

Zend_Controller_Plugin_ErrorHandler 提供了一个插件,用于处理应用程序抛出的异常,包括那些因缺少控制器或动作而导致的异常;它是 MVC 异常部分中列出的方法的替代方法。

该插件的主要目标是:

  • 没有路由匹配时引发拦截异常

  • 由于缺少控制器或操作方法而引发的拦截异常

  • 拦截动作控制器中引发的异常

换句话说,ErrorHandler 插件旨在处理 HTTP 404 类型错误(页面丢失)和 500 类型错误(内部错误)。 它不打算捕获其他插件中引发的异常。

于 2012-06-28T23:09:52.687 回答