0

假设我有两个捆绑包ParentBundleChildBundle. ChildBundle“扩展”ParentBundle

// ChildBundle/ChildBundle.php
<?php

namespace ChildBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class ChildBundle extends Bundle
{
    public function getParent()
    {
        return 'ParentBundle';
    }

}

然后,我将路由从 复制ParentBundleChildBundle,并指定要在其中使用的路由,并根据Symfony2 捆绑继承丢失父捆绑路由app/config/routing.yml重命名routing.yml

// app/config/routing.yml
child:
    resource: "@ChildBundle/Resources/config/routing_child.yml"
    hostname_pattern: child.example.com
    prefix:   /

parent:
    resource: "@ParentBundle/Resources/config/routing.yml"
    prefix:   /

之后,我创建了一个ChildBundle具有相同路径和名称的模板,以覆盖ParentBundle同名的模板。

但是,它会导致ChildBundle一直加载模板。

所以,我的问题是,我如何ChildBundle在一个域中加载(即使用覆盖模板/控制器等ChildBundle,当用户进入 child.example.com 时),同时ParentBundle在另一个域中使用(即使用覆盖模板/控制器等ParentBundle,当用户进入 example.com 时)?

4

1 回答 1

2

您应该阅读我所做的这个答案:Symfony2 上子应用程序的主页

实际上你必须在 web 文件夹中创建 2 个控制器,例如:web/app.php、web/app_child.php

在 app_child.php 中,调用一个新环境,这里称为“child”:

// ...    
$kernel = new AppKernel('child', false);
// ...

创建一个特定于子包的 config_child.yml,您可以在此处粘贴 config.yml 内容,甚至可以导入 config.yml 以防止重复代码:

// config_child.yml
imports:
    - { resource: config.yml }

创建一个包含子包路由的新路由文件,例如称为 routing_child.yml,并将此文件导入 config_child.php:

framework:
    router:
        resource: "%kernel.root_dir%/config/routing_child.yml"

从您的经典 routing.yml 文件中删除子捆绑路由。

现在使用您的 web/.htaccess 根据子域调用正确的环境:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Hit child app
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{HTTP_HOST} !^child\.example.com$ [NC]
    RewriteRule ^(.*)$ app_child.php [QSA,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

就是这样,现在您的应用程序将根据域加载正确的路由配置;)

于 2013-01-14T09:42:42.967 回答