ここに問題があります...「アクティブモジュール」の定義は何ですか?ZF2では、モジュールはトップレベルの名前空間によって大まかに定義されますが、モジュールは必要に応じて複数の名前空間でコードを提供できるため、絶対的なものではありません。
モジュール固有のレイアウトの構成に関するブログ投稿を書きました。この問題についてもう少し詳しく説明し、アクティブなモジュールに基づいてアクションを実行するための1つの可能な「解決策」を示します。http://blog.evan.pro/ module-specific-layouts-in-zend-framework-2
その例では、モジュール名(名前空間)であるイベント識別子を使用して「dispatch」イベントにアタッチしています。これは、ディスパッチされるコントローラーの最上位の名前空間に対してのみトリガーされます(この機能をZF2に特別に追加しました) 、ベータ期間で一般的な質問になりつつあったため)。これがどのように、またはなぜ機能するのか知りたい場合は、https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159(具体的には執筆時点で158行目)を参照してください。これ)。
または、ディスパッチイベントにアタッチして、ディスパッチされるコントローラーの最上位の名前空間を取得することもできます。繰り返しになりますが、これが実際に探している「モジュール名」であるという保証はありません。リクエストのディスパッチに関しては、「これはどのモジュールですか」ではなく、コントローラーとアクションについて考えるのが最善です。
class Module
{
public function onBootstrap($e) {
$events = $e->getApplication()->getEventManager()->getSharedManager();
$events->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
$controllerClass = get_class($e->getTarget()); // $e->getTarget() is the controller
$controllerTopNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'))
// Do whatever here, maybe something like:
// $nav = $e->getTarget()->getServiceLocator()->get('navigation');
// $nav->...
});
}
}