我是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()
请帮助我解决这个问题。
答案 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');
而是从配置中的not_found_template
值收集404错误的布局,并在RouteNotFoundStrategy
创建时注入HttpRouteNotFoundStrategyFactory
。您可以看到here on line 84 in the factory。
您可以通过自己从服务管理器收集RouteNotFoundStrategy
实例来覆盖该值:
$routeNotFoundStrategy = $serviceManager->get('HttpRouteNotFoundStrategy');
$routeNotFoundStrategy->setNotFoundTemplate('radmin/404');
同样,异常/错误的布局是从配置中的exception_template
值收集的,并在ExceptionStrategy
由HttpExceptionStrategyFactory
创建时注入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错误和异常的默认布局,只需在布局中添加一些自定义代码。这可能更简单,可能会减少开销。