スケルトン アプリケーションに基づいて、ZF2 アプリケーションでユーザー認証制御用のプラグインを実装しました。
ZF2 の開始時に複数のモジュールが完全に定義されていなかったため、Application\src フォルダーに、独自のモデル、コントローラー、フォーム、および名前空間を持つ Admin、Application、および User という名前の 3 つのフォルダーを作成しました。
UserAuthentication
which 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 **/
);