如果您的应用程序真的不同,我会怎么做:
结构:
// src/:
Sybio\Bundle\CoreBundle // Shared entities, config and tools
Sybio\Bundle\PortalBundle // Your main portal, domain.com
Sybio\Bundle\Ps3Bundle // Ps3 bundle
Sybio\Bundle\XboxBundle // Xbox bundle
// etc ...
也许更好的是,将所有控制台包添加到“控制台”存储库中:
Sybio\Bundle\CoreBundle // Shared entities, config and tools
Sybio\Bundle\PortalBundle // Your main portal, domain.com
Sybio\Bundle\Console\Ps3Bundle // Ps3 bundle
Sybio\Bundle\Console\XboxBundle // Xbox bundle
// etc ...
CoreBundle 用于在其他包之间共享实体,但不仅仅是:它将是包含模板特定部分的包,这些模板包含在所有包中。
之后,为每个控制台创建一个 Web 控制器:
web/app.php // Your main site
web/app_ps3.php // Ps3 app
web/app_xbox.php // Xbox app
// etc...
查看 app_ps3.php 内部,将 AppKernel 构造函数的第一个参数替换为控制台名称:
// ...
$kernel = new AppKernel('ps3', false);
// ...
如果需要,您可以复制开发版本中的每个控制器,例如 app_dev.php ...
现在,框架将根据使用的 web 控制器加载不同的环境。
例如,您的域“ps3.domain.com”将使用 web/app_ps3.php(我们将在最后看到如何做到这一点)。
该框架将在 app/AppKernel.php 中加载应用程序的配置:
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
如果访问者点击 web/app_ps3.php,框架将加载 config_ps3.yml 而不是经典的 config_dev.php 或 config_prod.php。您现在将使用捆绑依赖项!
为每个控制台创建一个“app/config_myconsole.php”和一个“app/routing_myconsole.yml”。
在 config_ps3.yml(和其他控制台)中,加载您的常规配置:
// config_ps3.yml
imports:
- { resource: config.yml }
在此行之后覆盖 ps3 路由文件的路由包含:
// config_ps3.yml
// ...
framework:
router:
resource: "%kernel.root_dir%/config/routing_ps3.yml"
要恢复,如果用户点击 web/app_ps3.yml,则加载文件 config_ps3.yml,然后加载通用 config.yml 文件,然后是 routing_ps3.yml(替换 routing.yml)。
您也可以只导入所需捆绑包的配置,对于每个配置文件,如果您有很多捆绑包,这可以减轻负载:
// config_ps3.yml
imports:
- { resource: config.yml }
- { resource: "@SybioCoreBundle/Resources/config/services.yml" }
- { resource: @SybioPs3Bundle/Resources/config/services.yml }
使用的每个控制台应用程序都是自己的路由,以及位于 CoreBundle 中的一些共享路由和操作。
对于每个应用程序,您需要加载其控制台路由和 corebundle 路由,这里是 routing_ps3.yml 的示例:
// routing_ps3.yml:
SybioCoreBundle:
resource: "@SybioCoreBundle/Controller/"
type: annotation
prefix: /
SybioPs3Bundle:
resource: "@SybioPs3Bundle/Controller/"
type: annotation
prefix: /
如果用户点击 web/app_ps3.yml,则加载来自 Ps3Bundle 和 CoreBundle 的路由...如果用户在http://ps3.domain.com/上,则将点击来自 Ps3Bundle 的路由“/”,而不是从另一个控制台或门户包路由“/”,因为您不加载它们!
如果您有一个在所有应用程序之间共享的通用页面,例如“/stats/”,只需在 CoreBundle 中创建此路由,这样您就不必在每个包上复制代码。当您在 Ps3Bundle 中包含 CoreBundle 路由时,框架将在两个包中搜索路由。
这条路线可以在这里访问:ps3.domain.com/stats/, xbox.domain.com/stats/...
最后,您需要做的最后一件事是根据子域使用正确的网络控制器,这里如何处理:
// web/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
# Hit ps3 app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} !^ps3\.domain.com$ [NC]
RewriteRule ^(.*)$ app_ps3.php [QSA,L]
# Hit xbox app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} !^xbox\.domain.com$ [NC]
RewriteRule ^(.*)$ app_xbox.php [QSA,L]
# Hit your main portal
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} !^www\.domain.com$ [NC]
RewriteRule ^(.*)$ app.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
我对虚拟主机不太满意,但通常它可以工作!
就是这样,您知道如何使用不同的配置来加载构建在同一核心上的不同应用程序!
干杯。