【问题标题】:prevent merging two module config in Zend Framework 2防止在 Zend Framework 2 中合并两个模块配置
【发布时间】:2015-12-28 07:58:41
【问题描述】:

我的 ZF2 应用程序中有两个模块,两个模块都有不同的配置,两个模块都有不同的 Module.php,里面有不同的配置。


我有一个 Admin 的登录过程,它在 Module.php 中定义,如下所示: 在 onBootstrap 函数中:

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',
        ),
    ),

这两个文件都在其模块文件夹中,具有相同的结构。 问:如何防止一个模块配置与另一个模块配置合并?

【问题讨论】:

    标签: php zend-framework zend-framework2 zend-config


    【解决方案1】:

    您不应该阻止合并。为 2 个模块加载不同的布局也有类似的问题 - 看看 https://stackoverflow.com/a/11921330/949273

    不幸的是,您的问题有点矛盾,因为如果您有一个 404 页面,则无法知道它是什么模块 - 因为它被称为 404 页面未找到

    无论如何,您都可以发送 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);
            }
        });
    }
    

    【讨论】:

    • 第一个问题呢?
    • 这种行为没问题,你不应该改变它。在 beforeDispatch() 函数中,你应该绕过 Front 模块的逻辑,例如。 if($module !== 'front'){ return true; } 否则执行代码...
    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      相关资源
      最近更新 更多