1

私のZF2アプリケーションには2つのモジュールがあり、両方のモジュールはそれ自体の構成が異なり、両方のモジュールには異なる構成の異なるModule.phpがあります。


以下のように Module.php で定義されている管理者用のログイン プロセスがあります。

public function onBootstrap($e) {        
        $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
            $controller = $e->getTarget();
            $controllerClass = get_class($controller);
            $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));
            if ('Admin' === $moduleNamespace) {
                $controller->layout('layout/admin');
            }
        }, 100);

        $application = $e->getApplication();
        $eventManager = $application->getEventManager();
        ..........
        ..........
        $eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'boforeDispatch'), 100);
    }

onBootstrapログイン処理チェックの内部で呼び出される boforeDispatch 関数

function boforeDispatch(MvcEvent $event) {
    ......
    //did something
    ......
}

Front モジュールを実行するときはいつでも、Admin モジュールの関数 beforeDispatch が実行されています。また、Frontモジュール内にコンテンツを持たない別の関数を定義しようとしたため、マージできませんでした。


2

両方のモジュールで異なる 404 テンプレートを作成しましたが、Front のテンプレートが実行されています。コードは次のとおりです。

'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/front'           => __DIR__ . '/../view/layout/layout.phtml',
            'front/index/index' => __DIR__ . '/../view/front/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),

両方のファイルは、同じ構造のモジュール フォルダー内にあります。Q: あるモジュール構成が別のモジュール構成とマージされないようにするにはどうすればよいですか?

4

2 に答える 2

2

合併を妨げてはなりません。2 つのモジュールに異なるレイアウトをロードする際にも同様の問題があります - https://stackoverflow.com/a/11921330/949273をご覧ください

残念ながら、404ページを取得した場合、それがどのモジュールであるかを知る方法がないため、問題は少し矛盾しています-そのため、404 page not foundと呼ばれます。

とにかく、MvcEvent::EVENT_DISPATCH_ERRORイベントをディスパッチし、正規表現 URL で確認して、別のビュー ファイルを設定することができます。

コード例

管理モジュールの設定で

'template_map' => array(
    'error-admin/404' => __DIR__ . '/../view/error/404.phtml',
),

EVENT_DISPATCH_ERROR よりもロジックを挿入します

public function onBootstrap(MvcEvent $e)
{
    $app = $e->getTarget();
    $em  = $app->getEventManager();
    $em->attach(MvcEvent::EVENT_DISPATCH_ERROR, function (\Zend\Mvc\MvcEvent $e) {
        $app = $e->getParam('application');
        $uri = $app->getRequest()->getUri()->getPath();

        if(strpos($uri, '/admin') === 0){
            $view = new \Zend\View\Model\ViewModel();
            $view->setTemplate('error-admin/404');
            $e->setViewModel($view);
        }
    });
}
于 2015-12-28T08:45:10.323 に答える
-2

多くの検索の後、私は私の質問の解決策を得ました。主な問題は、モジュール名を取得することでした。これが私のコードです。の助けを借りて生成しましたMvcEvent::getRouteMatch()->getParam()

function boforeDispatch(MvcEvent $event) {
    $controller = $event->getRouteMatch()->getParam('controller');
    $request_module = substr($controller, 0, strpos($controller, '\\'));  
    if ($request_module == __NAMESPACE__) {
        //do stuff
    }
}
于 2015-12-28T12:21:59.890 に答える