ACL を使用した新しい ZF3 アプリケーションがあります。ここで、不正アクセスの場合に、エラー ページ (たとえば 403) にリダイレクトする必要があります。イベントを発生させてからキャッチするのが最善の方法だと思いますが、失敗しました...
Module.php
すべては、 (抜粋)で、私のユーザーモジュールにあります:
namespace User;
use Zend\Mvc\MvcEvent;
use Zend\Permissions\Acl\Acl;
use Zend\Stdlib\Response ;
use Zend\View\Model\ViewModel;
[...]
class Module implements ConfigProviderInterface
{
[...]
public function onBootstrap(MvcEvent $e)
{
// Set event to check ACL, then to handle unauthorized access
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'checkProtectedRoutes'), 1);
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'dispatchError'), -999);
// Init ACL
$this->initAcl($e);
}
public function initAcl(MvcEvent $e)
{
[...]
}
public function checkProtectedRoutes(MvcEvent $e)
{
// My access logic working fine. return if OK
[...]
// if authorization failed
$e->setError('ACL_ACCESS_DENIED') ;
$e->setParam('route', $route);
$e->getTarget()->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $e);
}
public function dispatchError(MvcEvent $e)
{
// Check error type
$error = $e->getError();
switch ($error) {
case 'ACL_ACCESS_DENIED' :
// What should I do here ?
break;
default:
return ;
break;
}
return false ;
}
}
しかし、私のイベントがトリガーされると、私のdispatchError()
メソッドは決して呼び出されず、ZF3 は叫びます:
キャッチ可能な致命的なエラー: Zend\Mvc\View\Http\RouteNotFoundStrategy::detectNotFoundError() に渡される引数 1 は、Zend\Mvc\MvcEvent のインスタンスである必要があります。指定された Zend\EventManager\Event のインスタンスであり、/xxxxxxx/vendor/zendframework で呼び出されます。 271 行目の /zend-eventmanager/src/EventManager.php および 135 行目の /xxxxxxxx/vendor/zendframework/zend-mvc/src/View/Http/RouteNotFoundStrategy.php で定義されています。
どこが間違っているのか、このイベントをどのようにトリガー/キャッチする必要がありますか?