簡単な ACL モジュールをコントローラー プラグインとしてセットアップします。ここで、「拒否」に対して 403 応答を設定するだけで、template_map からの「エラー/403」ビューがレンダリングされるように、「403 レンダリング戦略」を実装したいと思います。機能は、元の 404 戦略に似ている必要があります。
調べてみましたZend\Mvc\View\Http\RouteNotFoundStrategy
が、少し太り気味でした。そうするためのより簡単な方法はありますか?
簡単な ACL モジュールをコントローラー プラグインとしてセットアップします。ここで、「拒否」に対して 403 応答を設定するだけで、template_map からの「エラー/403」ビューがレンダリングされるように、「403 レンダリング戦略」を実装したいと思います。機能は、元の 404 戦略に似ている必要があります。
調べてみましたZend\Mvc\View\Http\RouteNotFoundStrategy
が、少し太り気味でした。そうするためのより簡単な方法はありますか?
私が作者であるSlmErrorExceptionをご覧になるかもしれません。これにより、例外インターフェイスでマークされた例外をスローできます。このインターフェイスは、40xまたは50xのステータスコードを設定するかどうか、およびどのエラーテンプレートをレンダリングするかを決定します。
独自の例外を作成できます
namespace MyModule\Exception;
use SlmErrorException\Exception\UnauthorizedInterface;
exception UnauthorizedUserException
extends \Exception
implements UnauthorizedInterface
{
}
次に、コードのどこかに例外をスローすると、モジュールは、スローされた例外が既知のインターフェイスのいずれかを実装しているかどうかを確認します。次に、ステータスコードが設定され(この場合は403)、ビューerror/unauthorized
がレンダリングされます。
このモジュールは開発中であり、本番環境の準備ができていません。しかし、あなたはそれが合うかどうか見てみるかもしれません。おそらく、より多くの人々がこれを使用できるように、安定化に貢献し、テストを書くのを助けることができます。
これは、サードパーティのモジュールを使用しないソリューションです。
トリガーされたときにテンプレートを目的のイベントに設定するカスタム イベントを作成できます (コード コメントを読んでください)。
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);