2

これは簡単だと思いますが、ここで完全に立ち往生しています。

複数の「アプリケーション」を含むサイトを作成するために使用sf2していますが、メインページにそれらのある種のインデックスを表示したいのですが、これを行う方法がわかりません。この例を考えてみましょう (実際、これは私がやっていることではありませんが、これを使用できます):

私はいくつかのビデオ ゲーム コンソール (今のところ、PS3、360、WII、PSV、および NDS) のページを持っています。、などps3.domain.comのサイトに配置されます。それらのすべては実際にはそのロジックが異なります。それらはクローンではありません (それらのすべてに 1 つの「アプリ」)。共有しているコアとユーザー/コミュニティのものを除いて、それらはほとんど独立しています。しかし、www.domain.comまたは単にdomain.comでは、それらすべてへのリンクが必要であり、これをどこに配置するか、または他のすべての上に「グローバル」コントローラーを作成する方法がわかりません。360.domain.comnds.domain.com

誰か助けてくれませんか?

4

1 に答える 1

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

おそらくより良い方法は、「コンソール」リポジトリ内にすべてのコンソール バンドルを追加することです。

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 は、他のバンドル間でエンティティを共有するために使用されますが、それだけではありません: すべてのバンドルに含まれるテンプレートの特定の部分を含むバンドルになります。

その後、コンソールごとに 1 つの 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_dev.php または config_prod.php の代わりに config_ps3.yml をロードします。バンドルの依存関係で遊んでみましょう!

コンソールごとに「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 に配置されたアクションもあります。

アプリケーションごとに、そのコンソール ルートとコアバンドル ルートをロードする必要があります。ここでは、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/... からアクセスできます。

最後に、サブドメインに応じて適切な 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>

仮想ホストにはあまり慣れていませんが、通常は機能します。

これで、同じコア上に構築されたさまざまなアプリケーションをロードするために、さまざまな構成を操作する方法がわかりました。

乾杯。

于 2012-10-27T16:56:52.113 に答える