2012-10-25 1 views
2

나는 이것이 쉽다는 것을 확신하지만, 나는 완전히 여기에서 붙어있다.Symfony2의 하위 애플리케이션에 대한 메인 페이지

여러 개의 "응용 프로그램"이있는 사이트를 만들기 위해 sf2을 사용하고 있지만, 어떤 종류의 색인을 표시하기 위해 기본 페이지를 원합니다.이 작업을 수행하는 방법이 확실하지 않습니다. 이 예를 생각해 봅시다. (실제로는 제가하는 일이 아니지만 이것을 사용할 수 있습니다.)

일부 비디오 게임 콘솔 용 페이지가 있습니다 (현재 PS3, 360, WII, PSV 및 NDS 용). 그들은 ps3.domain.com, 360.domain.com, nds.domain.com과 같은 사이트에 위치하게됩니다. 그것들 모두는 실제로 논리적으로 다르다. 그것들은 복제품 (그것들 모두를위한 하나의 "app")이 아니며, 그들이 공유하고있는 코어와 사용자/커뮤니티 물건을 제외하고는 대부분 독립적이다. 그러나 www.domain.com 또는 단지 domain.com에서, 나는 그들 모두에 대한 링크를 가질 필요가 있으며, 어디에 넣을 것인지, 다른 모든 것보다 "글로벌"컨트롤러를 만드는 방법을 모르겠습니다.

누군가 나를 도울 수 있습니까?

+1

다른 사이트에서이 방법을 사용 했으므로 기본 사이트에 다른 앱을 만들면 안됩니까? –

+0

OMG, 네 말이 맞아, 내 질문에 거의 당혹스러워. – Ikzer

답변

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은 다른 번들 사이에서 엔티티를 공유하는 데 사용되지만 모든 번들에 포함되는 특정 템플릿 부분을 포함하는 번들이 아닙니다.

web/app.php // Your main site 
web/app_ps3.php // Ps3 app 
web/app_xbox.php // Xbox app 
// etc... 

이 app_ps3.php 내부를 볼 콘솔의 이름으로 AppKernel 생성자의 첫 번째 PARAM을 대체 :

// ...  
$kernel = new AppKernel('ps3', false); 
// ... 

당신이 할 수있는

당신이 콘솔 당 하나의 웹 컨트롤러를 생성 한 후 원하는 경우 dev_version에서 각 컨트롤러를 복제하십시오. 예를 들어 app_dev.php ...

이제 프레임 워크는 사용 된 webcontrol에 따라 다른 환경을로드합니다 아르 자형.

예를 들어 도메인 "ps3.domain.com"은 web/app_ps3.php를 사용합니다 (마지막에는이를 수행하는 방법을 보여줍니다).

프레임 워크는 응용 프로그램/AppKernel.php에서 응용 프로그램의 설정을로드합니다 : 방문자가 웹/app_ps3.php 충돌하는 경우

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

, 프레임 워크는 고전 config_dev 대신 config_ps3.yml로드됩니다. PHP 또는 config_prod.php. 이제 여러분은 번들 의존성을 가지고 놀 것입니다!

각 콘솔마다 "app/config_myconsole.php"와 "app/routing_myconsole.yml"을 만듭니다.

config_ps3에 있습니다.사용자가 웹을 치면/app_ps3.yml을

// config_ps3.yml 

// ... 

framework: 
    router: 
     resource: "%kernel.root_dir%/config/routing_ps3.yml" 

다시 시작하려면 : PS3의 라우팅 파일에 대한 라우팅 포함을 오버라이드 (override)이 선 후

// config_ps3.yml 
imports: 
    - { resource: config.yml } 

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

사용자는 Ps3Bundle 및 CoreBundle에서 웹/app_ps3.yml, 경로를 칠 경우 로드 중입니다 ... 사용자가 http://ps3.domain.com/ 일 경우 il은 Ps3Bundle에서 경로 "/"를 치고로드하지 않으므로 다른 콘솔 또는 포털 번들에서 "/"경로를 찾지 않습니다!

모든 응용 프로그램간에 공유되는 "/ stats /"와 같은 일반적인 페이지가있는 경우 CoreBundle에서이 경로를 작성하면 각 번들에 코드를 복제 할 필요가 없습니다. Ps3Bundle과 함께 CoreBundle 경로를 포함 시켰기 때문에 프레임 워크는 두 번들 모두에서 경로를 검색합니다.

이 경로는 여기에 액세스 할 수 있습니다 : 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> 

내가 가상 호스트 정말 편안 아니지만, 일반적으로 작동!

다른 구성으로 동일한 코어에 구축 된 다른 응용 프로그램을로드하는 방법을 알고 있습니다.

건배.

+0

대단히 감사합니다! 이것은 나를 많이 도왔고 실제로 원래의 것보다 더 많은 문제를 해결했습니다. ^^ – Ikzer

+0

조언이 한 번 더 - "모든 것이 번들입니다"라는 사고 방식을 극복하십시오. 모든 것이 번들이되어야하는 것은 아닙니다. 예를 들어 엔티티는 Symfony 전용이 아니며 (Symfony 앱 외부에서 사용될 수 있습니다) 안전하게 번들이 아닌 자체 네임 스페이스에 넣을 수 있습니다. –

관련 문제