Symfony2上子应用程序的主页面

Ikz*_*zer 2 php symfony

我敢肯定,这是很容易的,但我完全被困在这里.

我正在使用sf2多个"应用程序"创建一个网站,但我想要一个主页显示它们的某种索引,我不知道如何做到这一点.让我们想想这个例子(实际上,它不是我正在做的,但我们可以使用它):

我有一个视频游戏控制台的页面(目前,PS3,360,WII,PSV和NDS).它们将位于象网站ps3.domain.com,360.domain.com,nds.domain.com等等.它们中的每一个实际上都与它的逻辑不同,它们不是克隆(每个都是一个"应用程序"),它们大多是独立的,除了它们共享的核心和用户/社区的东西.但是在www.domain.com或者只是domain.com,我需要链接到所有这些,我不知道在哪里放置它,或者如何使"全局"控制器高于其他所有控制器.

有人能帮帮我吗?

Syb*_*bio 7

如果你的应用程序真的不同,我会这样做:

结构体:

// 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 ...
Run Code Online (Sandbox Code Playgroud)

也许更好的是,在"控制台"存储库中添加所有控制台包:

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 ...
Run Code Online (Sandbox Code Playgroud)

CoreBundle用于在其他bundle之间共享实体,但不仅仅是:它将是包含所有bundle中包含的特定模板部分的bundle.

之后,您为每个控制台创建一个Web控制器:

web/app.php // Your main site
web/app_ps3.php // Ps3 app
web/app_xbox.php // Xbox app
// etc...
Run Code Online (Sandbox Code Playgroud)

请参阅app_ps3.php内部,用控制台名称替换AppKernel构造函数的第一个参数:

// ...    
$kernel = new AppKernel('ps3', false);
// ...
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在dev版本中复制每个控制器,例如app_dev.php ...

现在,框架将根据使用的webcontroller加载不同的环境.

例如,您的域名"ps3.domain.com"将使用web/app_ps3.php(我们将在最后看到如何执行此操作).

该框架将在app/AppKernel.php中加载应用程序的配置:

public function registerContainerConfiguration(LoaderInterface $loader)
{
    $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
Run Code Online (Sandbox Code Playgroud)

如果访问者访问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 }
Run Code Online (Sandbox Code Playgroud)

在此行覆盖ps3路由文件的路由包含之后:

// config_ps3.yml

// ...

framework:
    router:
        resource: "%kernel.root_dir%/config/routing_ps3.yml"
Run Code Online (Sandbox Code Playgroud)

要恢复,如果用户点击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 }
Run Code Online (Sandbox Code Playgroud)

使用的每个控制台应用程序都是自己的路由,还有一些位于CoreBundle中的共享路由和操作.

对于每个应用程序,您需要加载其控制台路由和corebundle路由,这里是routing_ps3.yml的示例:

// routing_ps3.yml:
SybioCoreBundle:
    resource: "@SybioCoreBundle/Controller/"
    type:     annotation
    prefix:   /

SybioPs3Bundle:
    resource: "@SybioPs3Bundle/Controller/"
    type:     annotation
    prefix:   /
Run Code Online (Sandbox Code Playgroud)

如果用户点击了web/app_ps3.yml,则会加载来自Ps3Bundle和CoreBundle的路由...如果用户在http://ps3.domain.com/上,则il将从Ps3Bundle点击路径"/",而不是从另一个控制台或门户网站捆绑"/"路由,因为你没有加载它们!

如果您有一个通用页面,例如"/ stats /",它在所有应用程序之间共享,只需在CoreBundle中创建此路由,这样您就不必在每个包上复制代码.当您使用Ps3Bundle包含CoreBundle路由时,框架将在两个包中搜索路由.

这条路线可以在这里访问:ps3.domain.com/stats/,xbox.domain.com/stats/...

要完成,您需要做的最后一件事是根据子域使用正确的web控制器,这里如何处理:

// 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>
Run Code Online (Sandbox Code Playgroud)

我对vhosts并不是很满意,但通常它会起作用!

就是这样,你知道如何使用不同的配置来加载构建在同一核心上的不同应用程序!

干杯.