ZendFramework 2.3 - 设置模块明智的错误布局

时间:2016-08-30 05:14:37

标签: php zend-framework zend-framework2

我是Zend 2.3的新手并创建了一个Web应用程序。在这个Web应用程序中,我有两个不同的模块,它们有两种不同的布局结构。

我已经为两个模块设置了不同的布局,这些布局仅在分派中没有任何错误时才有效。现在我想为404错误页面设置不同的布局。

下面是两个模块onBootstrap()::

模块A Module.php

public function onBootstrap($e) {
        $eventManager   = $e->getApplication()->getEventManager();

        $serviceManager = $e->getApplication()->getServiceManager();
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, function($event) use ($serviceManager ) {
            $response = $event->getResponse();
            if ($response->getStatusCode() == "404")
            {
                $controller = $event->getTarget();
                $controllerClass = get_class($controller);
                $config = $event->getApplication()->getServiceManager()->get('config');
                $controller->layout('radmin/error');
            }
        }, -100);

        $eventManager->getSharedManager()
            ->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', function($e) {
                $controller = $e->getTarget();
                $controllerClass = get_class($controller);
                $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));
                $config = $e->getApplication()->getServiceManager()->get('config');
                if (isset($config['module_layouts'][$moduleNamespace])) {
                    $controller->layout($config['module_layouts'][$moduleNamespace]);
                }
            }, 100);
    }

模块A module.config.php

'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(
            'radmin/layout'           => __DIR__ . '/../view/layout/radmin.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'radmin/error'             => __DIR__ . '/../view/error/index.phtml',
            'javascripts'             => __DIR__ . '/../view/layout/javascripts.phtml',
        ),
        'template_path_stack' => array(
           'radmin' => __DIR__ . '/../view',
        ),
    ),
    'module_layouts' => array(
        'Radmin' => 'layout/radmin.phtml'
),

另一个模块模块B的方式相同。但它不起作用。对于每个模块,它都需要错误页面的应用程序布局。

我收到了::致命错误:调用未定义的方法Zend \ Mvc \ Application :: layout()

请帮助我解决这个问题。

2 个答案:

答案 0 :(得分:0)

似乎 view_manager-> template_path_stack-> modulea view_manager-> module_layouts-> Radmin 不匹配。源中的实际模块名称是什么。是Modulea.php还是Radmin.php?如果模块名称被认为是Blah.php view_manager-> template_path_stack-> blah和view_manager-> module_layouts-> Blah,它应该看起来像这样。

尝试一下,看看它是否有效。

答案 1 :(得分:0)

未从控制器类解析异常和404错误的布局模板。因此,像您一样设置控制器上的错误布局并没有帮助:

$controller->layout('radmin/error');

对于404错误

而是从配置中的not_found_template值收集404错误的布局,并在RouteNotFoundStrategy创建时注入HttpRouteNotFoundStrategyFactory。您可以看到here on line 84 in the factory

您可以通过自己从服务管理器收集RouteNotFoundStrategy实例来覆盖该值:

$routeNotFoundStrategy = $serviceManager->get('HttpRouteNotFoundStrategy');
$routeNotFoundStrategy->setNotFoundTemplate('radmin/404');

例外

同样,异常/错误的布局是从配置中的exception_template值收集的,并在ExceptionStrategyHttpExceptionStrategyFactory创建时注入HttpExceptionStrategy。您可以看到here on line 71 in the factory

您可以通过自己从服务管理器收集$exceptionStrategy = $serviceManager->get('HttpExceptionStrategy'); $exceptionStrategy->setExceptionTemplate('radmin/error'); 实例来覆盖该值:

export class ParentView extends Component {
  state = {
    selectedItem: {}
  }

  handleClick = (item) => {
    alert('you click me');
    this.setState({selectedItem: item});
  } 

  render() {
    let item = { name: 'Item-1' };
    return (
      <div>
        <ChildItem item={item} handleClick={this.handleClick} />
      </div>
    );
  }
}

export class ChildItem extends Component {
  render() {
    const {item, handleClick} = this.props;
    return (
      <div>
        <a  onClick={handleClick(item)} />
      </div>
    );
  }
}

这未经过测试,但我几乎可以肯定它应该有效......

注意: 我不确定这是否被视为良好做法。您还可以考虑坚持404错误和异常的默认布局,只需在布局中添加一些自定义代码。这可能更简单,可能会减少开销。