1

簡単な ACL モジュールをコントローラー プラグインとしてセットアップします。ここで、「拒否」に対して 403 応答を設定するだけで、template_map からの「エラー/403」ビューがレンダリングされるように、「403 レンダリング戦略」を実装したいと思います。機能は、元の 404 戦略に似ている必要があります。

調べてみましたZend\Mvc\View\Http\RouteNotFoundStrategyが、少し太り気味でした。そうするためのより簡単な方法はありますか?

4

2 に答える 2

2

私が作者であるSlmErrorExceptionをご覧になるかもしれません。これにより、例外インターフェイスでマークされた例外をスローできます。このインターフェイスは、40xまたは50xのステータスコードを設定するかどうか、およびどのエラーテンプレートをレンダリングするかを決定します。

独自の例外を作成できます

namespace MyModule\Exception;

use SlmErrorException\Exception\UnauthorizedInterface;

exception UnauthorizedUserException
    extends \Exception
    implements UnauthorizedInterface
{
}

次に、コードのどこかに例外をスローすると、モジュールは、スローされた例外が既知のインターフェイスのいずれかを実装しているかどうかを確認します。次に、ステータスコードが設定され(この場合は403)、ビューerror/unauthorizedがレンダリングされます。

このモジュールは開発中であり、本番環境の準備ができていません。しかし、あなたはそれが合うかどうか見てみるかもしれません。おそらく、より多くの人々がこれを使用できるように、安定化に貢献し、テストを書くのを助けることができます。

于 2013-02-09T08:46:04.307 に答える
2

これは、サードパーティのモジュールを使用しないソリューションです。

トリガーされたときにテンプレートを目的のイベントに設定するカスタム イベントを作成できます (コード コメントを読んでください)。

public function onBootstrap(MvcEvent $e)
{
    $eventManager = $e->getApplication()->getEventManager();

    $eventManager->getSharedManager()->attach('custom', '403', function(MvcEvent $event) use($eventManager){

        //set the 403 template you have previously prepared
        $viewModel = new ViewModel();
        $viewModel->setTemplate('error/403');

        $appViewModel = $event->getViewModel();
        $appViewModel->setTemplate('layout/layout');//set the default layout (optional)
        $appViewModel->addChild($viewModel, 'content');//add the 403 template to the app layout

        //prevent the MvcEvent::EVENT_DISPATCH to fire by calling it
        //with high priority (100) and using $event->stopPropagation(true);
        $eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) {
            $event->stopPropagation(true);
        }, 100);
    });
}

そして、コードのどこからでもこのイベントをトリガーできます。

$e = new \Zend\Mvc\MvcEvent();
$eventManager = new \Zend\EventManager\EventManager('custom');
$eventManager->trigger('403', $e);
于 2016-04-29T07:09:15.703 に答える