Symfony2用于子域路由的多个配置和路由文件

时间:2012-09-28 02:15:08

标签: symfony symfony-2.1

我们正在构建一个Symfony2应用程序,它将使用子域服务于不同的部分:

  1. api.tld.com - API系统
  2. docs.tld.com - 文档
  3. assets.tld.com - 提供图像的系统
  4. 我们如何做到这一点是为每个子域创建一个app目录,并将标准/ app目录保存为中央共享配置。每个应用程序的Web目录中都有一个自定义引导程序。使用.htaccess相应地路由子域。

    我遇到的问题是多个配置文件进来的地方,特别是当他们有自己的路由导入时。在某些情况下,最多可以有4个configs.yml文件。以下面的URL为例:

    http://testing.docs.tld.com

    配置设置目前的工作原理如此(并且可以正常工作)

    1. tld.com - 全局配置位于/app/config/config.yml
    2. testing - 位于/app/config/config_testing.yml的环境配置。此配置还会在同一目录中导入config_dev.yml。
    3. docs - App config位于/app_docs/config/config.yml
    4. 这些都是在/app_docs/AppKernal.php中的AppKernal中导入的:

      // Load Global Configuration
      // ROUTES INSIDE THIS CONFIG ARE NOT BEING LOADED
      $loader->load(__DIR__.'/../app/config/config.yml');
      
      // Load Environment Configuration
      // ROUTES INSIDE THIS CONFIG ARE NOT BEING LOADED
      $loader->load(__DIR__.'/../app/config/config_' . $this->getEnvironment() . '.yml');
      
      // Load App-centric Configuration
      $loader->load(__DIR__.'/config/config.yml');
      

      现在配置加载就好了。但是,我遇到的问题,并没有找到任何明确的文档,是这些配置中不止一个定义框架:路由器:资源。在上面的示例配置中,这些是按以下方式加载(无论如何都尝试):

      /app/config/config.yml

      framework:
          secret:%secret%
          router:
              resource: "%kernel.root_dir%/config/routing.yml"
              strict_requirements: %kernel.debug%
      

      /app/config/config_testing.yml

      // No special Routing
      

      /app/config/config_dev.yml

      framework:
          router:   { resource: "%kernel.root_dir%/config/routing_dev.yml" }
      

      /app_docs/config/config.yml

      framework:
          secret: %secret%
          router:
              resource: "%kernel.root_dir%/config/routing.yml"
              strict_requirements: %kernel.debug%
      

      所有的配置都很好。但我发现只包括上面调用的最后一个路由文件。所以我假设规则是它们通常被覆盖而不是扩展。

      所以我在最近几天试图找出的是,是否有可能以上述方式扩展包含配置文件中的路由文件?我调查的另一个选项是找到一种在AppKernal文件中导入路由文件的方法。我只能找到this,它没有准确解释应该在什么时候使用(或在哪里)。它在包含配置的AppKernal中不起作用,所以我假设路由器在那个阶段没有活动。

      有人有什么想法吗?我会非常感激。

1 个答案:

答案 0 :(得分:4)

我有同样的需要所以我们这样做:

/apps/config
/apps/config/common_config.yml
/apps/config/common_routing.yml
/apps/config/...

/apps/myapp1
/apps/myapp1/myapp1Kernel.php
/apps/myapp1/...
/apps/myapp1/config
/apps/myapp1/config/config.yml
/apps/myapp1/config/routing.yml
/apps/myapp1/config/...

/apps/myapp2
/apps/myapp2/myapp1Kernel.php
/apps/myapp2/...
/apps/myapp2/config
/apps/myapp2/config/config.yml
/apps/myapp2/config/routing.yml
/apps/myapp2/config/...

...

在每个应用程序的yml文件中,我们都有:

<强> /apps/myapp1/config/config.yml

imports:
    - { resource: "../../config/common_config.yml" }

然后,您必须在/ web

中以相同的方式重现
/web/myapp1/app.php

谁将致电您的应用

$kernel = new myapp1Kernel('prod', false);
$kernel->loadClassCache();
Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);