0

スケルトン アプリケーションに基づいて、ZF2 アプリケーションでユーザー認証制御用のプラグインを実装しました。

ZF2 の開始時に複数のモジュールが完全に定義されていなかったため、Application\src フォルダーに、独自のモデル、コントローラー、フォーム、および名前空間を持つ Admin、Application、および User という名前の 3 つのフォルダーを作成しました。

UserAuthenticationwhich extendsという名前のプラグイン クラスを作成し、Module.php ファイルZend\Mvc\Controller\Plugin\AbstractPluginに添付しました。eventManager

public function onBootstrap(MvcEvent $e) {
    $e->getApplication()->getServiceManager()->get('translator');
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    var_dump('OnBootstrap');
    $eventManager->attach('dispatch', array($this, 'loadConfiguration'), 2);
}

public function loadConfiguration(MvcEvent $e) {
    $application   = $e->getApplication();
    $sm            = $application->getServiceManager();
    $sharedManager = $application->getEventManager()->getSharedManager();
    var_dump('loadConfiguration');
    $sharedManager->attach('Zend\Mvc\Controller\AbstractActionController','dispatch',
            function($e) use ($sm) {
                var_dump('attach');
                return $sm->get('ControllerPluginManager')->get('userAuthentication')->preDispatch($e);
            }
    );
}

私の問題は次のとおりです。
このプラグインは、名前空間のコントローラーでは正常に機能しますAdmin\Controllerが、アプリケーションのコントローラー (名前空間Application\Controller) では機能しません。これは私の頭を壊します。

スニペットでわかるようにvar_dump()、エラーを追跡するために複数記述しましたが、アプリケーションのコントローラーの場合、この行は実行されていないようです:

$sharedManager->attach('Zend\Mvc\Controller\AbstractActionController','dispatch',
        function($e) use ($sm) {
            var_dump('attach');
            return $sm->get('ControllerPluginManager')->get('userAuthentication')->preDispatch($e);
        }
);



編集
私は解決策を見つけました。
デフォルトでは優先度が 1 であるイベント間の優先度の問題でした。この関数に追加のパラメータを追加するだけです:

$sharedManager->attach('Zend\Mvc\Controller\AbstractActionController','dispatch',
        function($e) use ($sm) {
            var_dump('attach');
            return $sm->get('ControllerPluginManager')->get('userAuthentication')->preDispatch($e);
        }, 2  /**<--- Priority parameter **/
);
4

0 に答える 0