Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2上的子应用程序主页_Php_Symfony - Fatal编程技术网

Php Symfony2上的子应用程序主页

Php Symfony2上的子应用程序主页,php,symfony,Php,Symfony,我相信这很容易,但我完全被困在这里了 我正在使用sf2来创建一个包含多个“应用程序”的站点,但我希望在主页上显示这些应用程序的某种索引,我不确定如何做到这一点。让我们想想这个例子(实际上,这不是我正在做的,但我们可以使用这个): 我有一些视频游戏机的页面(目前,PS3、360、WII、PSV和NDS)。它们将位于ps3.domain.com、360.domain.com、nds.domain.com等网站。他们中的每一个人实际上在逻辑上都是不同的,他们不是克隆人(每个人都有一个“应用程序”),他

我相信这很容易,但我完全被困在这里了

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

我有一些视频游戏机的页面(目前,PS3、360、WII、PSV和NDS)。它们将位于
ps3.domain.com
360.domain.com
nds.domain.com
等网站。他们中的每一个人实际上在逻辑上都是不同的,他们不是克隆人(每个人都有一个“应用程序”),他们大多是独立的,除了核心和用户/社区的东西,他们正在共享。但不管是在哪种情况下,我都需要与它们建立链接,我不知道该把它放在哪里,也不知道如何使“全局”控制器凌驾于所有其他控制器之上


有人能帮我吗?

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

结构:

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

之后,您将为每个控制台创建一个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);
// ...
如果需要,可以在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');
}
如果访问者点击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文件,然后加载general 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路由,下面是路由_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的路由。。。 如果用户处于开启状态,il将点击来自Ps3Bundle的路由“/”,而不是来自其他控制台或门户捆绑包的路由“/”,因为您不会加载它们

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

此路径可在以下位置访问: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>
//web/.htaccess
重新启动发动机
#点击ps3应用程序
重写cond%{REQUEST_FILENAME}-F
重写cond%{HTTP_HOST}^ps3\.domain.com$[NC]
重写规则^(.*)$app_ps3.php[QSA,L]
#点击xbox应用程序
重写cond%{REQUEST_FILENAME}-F
重写cond%{HTTP_HOST}^xbox\.domain.com$[NC]
重写规则^(.*)$app_xbox.php[QSA,L]
#点击你的主入口
重写cond%{REQUEST_FILENAME}-F
重写cond%{HTTP_HOST}^www\.domain.com$[NC]
重写规则^(.*)$app.php[QSA,L]
重写cond%{REQUEST_FILENAME}-F
重写规则^(.*)$app.php[QSA,L]
我对vhosts不是很满意,但通常它是有效的

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


干杯。

既然你已经在其他网站上采用了这种方法,为什么不为主站点创建另一个应用程序呢?天哪,你说得对,这太明显了,我几乎对我的问题感到尴尬。非常感谢!这对我帮助很大,实际上解决了比我原来的问题多得多的问题^^还有一条建议——克服“一切都是一捆”的心态。不是所有的东西都应该是一捆。例如,实体不是特定于Symfony的(可以在Symfony应用程序之外使用),您可以安全地将它们放入自己的命名空间(而不是捆绑包)。