3

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

  1. api.tld.com - API 系统
  2. docs.tld.com - 文档
  3. assets.tld.com - 提供图像的系统

我们这样做的方式是为每个子域创建一个 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_docs/config/config.yml 的应用程序配置

这些都是在 /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 文件中导入路由文件的方法。我只能找到这个,它并没有准确解释应该在什么时候使用(或在哪里)。它在包含配置的 AppKernal 中不起作用,因此我假设路由器在该阶段未处于活动状态。

有人有想法么?我将不胜感激。

4

1 回答 1

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);
于 2013-05-24T16:02:05.317 回答