gpt4 book ai didi

php - Symfony2 子应用程序的主页

转载 作者:行者123 更新时间:2023-12-02 07:39:10 27 4
gpt4 key购买 nike

我确信这很容易,但我完全被困在这里。

我正在使用 sf2 创建一个包含多个“应用程序”的站点,但我希望主页显示它们的某种索引,但我不确定如何执行此操作。让我们想想这个例子(实际上,这不是我正在做的,但我们可以使用它):

我有一些视频游戏机的页面(目前是 PS3、360、WII、PSV 和 NDS)。它们位于 ps3.domain.com360.domain.comnds.domain.com 等网站。它们中的每一个实际上在逻辑上都是不同的,它们不是克隆(每个应用程序对应一个“应用程序”),它们大多是独立的,除了它们共享的核心和用户/社区内容。但是在www.domain.com或者只是 domain.com ,我需要链接到所有这些链接,但我不确定将它放在哪里,或者如何在所有其他 Controller 之上创建一个“全局” Controller 。

有人能帮帮我吗?

最佳答案

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

结构:

// 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 用于在其他 bundle 之间共享实体,但不仅如此:它将是包含所有 bundle 中包含的模板的特定部分的 bundle。

之后,您为每个控制台创建一个网络 Controller :

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);
// ...

如果需要,您可以在开发版本中复制每个 Controller ,例如 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');
}

如果访问者点击 web/app_ps3.php,框架将加载 config_ps3.yml 而不是经典的 config_dev.php 或 config_prod.php。您现在将使用 bundle 依赖项!

为每个控制台创建一个“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/ , il 将命中来自 Ps3Bundle 的路径“/”,而不是来自另一个控制台或门户包的路径“/”,因为你没有加载它们!

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

此路由可在此处访问:ps3.domain.com/stats/、xbox.domain.com/stats/...

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

// 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>

我对虚拟主机不是很满意,但通常它可以工作!

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

干杯。

关于php - Symfony2 子应用程序的主页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com