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;
    }
}

また、HTTP エラー コードがなく、サーバーやクライアントを混乱させる可能性があるため、応答コードを から666に変更しました。4036xx

それが役立つことを願っています。

于 2012-06-28T23:14:12.217 に答える
5

エラー コントローラ プラグインを使用してプログラム エラーを管理しないでください。必要なメッセージが表示されるコントローラーにユーザーをリダイレクトすることをお勧めします。Zend Framework でのエラー コントローラーの実装は、不必要に複雑です。リダイレクトすることで問題を簡単に解決できます。

プログラムエラーにエラーコントローラーを使用することもお勧めできません。ドキュメントの詳細は以下のとおりです。

Zend_Controller_Plugin_ErrorHandler は、アプリケーションによってスローされた例外を処理するためのドロップイン プラグインを提供します。これには、コントローラーやアクションの欠落によるものも含まれます。これは、MVC 例外セクションにリストされているメソッドの代替です。

プラグインの主なターゲットは次のとおりです。

  • ルートが一致しない場合に発生するインターセプト例外

  • コントローラーまたはアクション メソッドがないために発生した例外をインターセプトする

  • アクション コントローラー内で発生した例外をインターセプトする

つまり、ErrorHandler プラグインは、HTTP 404 タイプのエラー (ページの欠落) と 500 タイプのエラー (内部エラー) を処理するように設計されています。 他のプラグインで発生した例外をキャッチすることは意図されていません。

于 2012-06-28T23:09:52.687 に答える