ZF2根据域加载不同的视图

时间:2017-07-21 12:11:21

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

我有一个应用程序,我想使用我的应用程序中的现有模块基于不同的域加载一些不同的视图,我如何在我的路线中实现这一点?

我只想改变我的布局,所以我的vriews应该只涉及。

2 个答案:

答案 0 :(得分:0)

第一部分

在ZF2中,您可以在ActionControllers中更改布局:

public function indexAction () 
{
     $this->layout('layout/customLayout');

     return $viewModel;
}

因此,您必须在module.config.php(view_manager部分)中添加一个条目:

//... configs
'view_manager' => array(
    // other configs...
    'template_map' => array(
        'layout/layout' => 'path to default layout',
        'layout/customLayout' => 'path to custom layout',
    ),
),

第二部分

您的服务器上有2个指向同一源代码目录(您的zf2-project)的域名:

通过Web服务器配置(nginx,apache),两个请求都将路由到IndexController(例如,在Application模块中)。默认情况下,路由不依赖于服务器的名称(主机名)。或者更好地说:它的域名。仅供参考,您可以为特定主机名配置路由,但这可能是偏离主题的;)Web服务器会更改PHP的一些环境变量,例如: $_SERVER取决于呼叫域。在这个php数组中,您可以检测当前服务器名称等详细信息。 在Application \ Controller \ IndexController:

中检测到这一点
public function indexAction() {
    $serverName = $this->getRequest()->getServer('SERVER_NAME'); 
    $layout = ($serverName == 'domain2.com') ? 'layout/customLayout' : 'layout/layout';
    $this->layout($layout);
    // other stuff
}

答案 1 :(得分:0)

我在我的模块(Module.php)中做了那种事情。在bootstrap方法中,我首先触发setLayout-Method。但首先我需要在template_map中设置我的布局。然后我可以根据路线,控制器,主机等更改布局。我在特定模式之后构建我的路线,以便逻辑地对它们进行分组。 ;)

public function onBootstrap(MvcEvent $e)
{
    $app = $e->getParam('application');

    $app->getEventManager()->attach(
        'dispatch', array(
        $this,
        'setLayout'
    ));
}
public function setLayout(MvcEvent $e)
{
    $matches = $e->getRouteMatch();
    $routeName = $matches->getMatchedRouteName();
    $controller = $matches->getParam('controller');
    $serverHost = $_SERVER["HTTP_HOST"];
   # ... Implement your application logic ...use Switch or sth. ...# 
    e->getTarget()->layout('layout/layout'); // <-- based on host and your logic
}