2012-10-09 7 views
2

저는 ZF2를 배우고 응용 프로그램을 계획 중입니다.ZF2 : 모듈 그룹

여러 개의 모듈 그룹으로 1 개의 응용 프로그램을 갖고 싶습니다. 각 모듈 그룹에는 최대 20 개 이상의 모듈이 포함될 수 있습니다.

전체 앱의 고유 한 모듈 이름을 보장 할 수는 없지만 모듈 그룹 내에서의 고유성을 보장 할 수는 있습니다.

호스팅 라우터를 사용하여 모듈 그룹으로 요청을 라우팅하는 것이 이상적입니다.

=> '관리자/푸/인덱스/색인' http://admin.mysite.com/foo/,

http://special.mysite.com/foo/ => '특수/푸/인덱스/색인'

아이디어 # 1

내가 다른를 사용하는 기대했다 각 모듈 그룹에 대한 module_path 및 모듈 그룹 주위의 모듈 경로 이름을 지정하여 모듈 클래스의 고유성을 판별하십시오. 그러나 module_autoloader로 전송 된 모듈은 전달 된 문자열의 첫 번째 부분에만주의를 기울이는 것처럼 보입니다.

  • 세 올바른 모듈 컨트롤러를 가리 킵니다 그러나 그들은 (모듈 목록에서 첫 번째) 관리 \의 관리자에 대한 뷰를로드

    array('modules' => array(
    'Admin\Admin','Admin\Bob','Admin\Users' 
    )); 
    

    이것은 내가 이해할 수없는 이상한 행동을 얻는다 그들 자신의 대신에.

  • I.E./users, Admin \ Users \ IndexController를로드하지만 Admin \ Admin \ view \ admin \ Index \ index.phtml보기 스크립트를 사용하십시오.

템플릿 인 젝트에 대한 약간의 변경으로이 문제를 해결할 수 있지만 어질러 놓은. 자신의 서브 디렉토리에

아이디어 # 2

그냥 접두사 모듈 이름 예를 들어,

namespace AdminAdmin\Controller, 
class IndexController {} 

생각

  • 네임 스페이스 클래스 접두사 선호 할 것입니다 우리가 대신 각 모듈에 대해 하드 코딩 된 경로를 사용 가능한이만큼을 자동화하려는
  • 을 일반적인 쿠키 호스트/memcache 및 db 등을 통해 인증을위한 모듈을 공유하는 여러 응용 프로그램을 사용하는 것이 합리적 일 수 있습니다.
  • 모듈 컨트롤러의 treeRouteStack 내부에서 호스팅 유형 경로를 사용하여 각 모듈을 특정 하위 도메인에 라우팅합니다.

질문 :

  • 이 상황 또는 유사한 이유에 대한 가장 좋은 방법은 자신인가?

    (1)의 네임 모듈

    이 기본적 ZF2 가능합니다 : 귀하의 질문의

+0

ZF2 모듈을 올바르게 이해 했습니까? ZF2에서 "모듈로 라우팅"과 같은 것이 없으므로 ZF1 모듈로 작업하는 것처럼 가정을하고있는 것처럼 보입니다. – Ocramius

+0

내 용어를 용서하지만, 루트가 zf2의 특정 모듈을 가리키는 많은 * working * 응용 프로그램을 사용했습니다. –

+0

ZF2의 모듈은 라우팅 할 수있는 것이 아닌 기능입니다. \ 컨트롤러에 연결할 수 있습니다 ... 이름을 바꾸면 다른 질문이지만 개념을 별도로 유지하면 전원을 어떻게 발휘할 수 있는지 이해하는 데 도움이됩니다 모듈 관리자의 전체 "병합"메커니즘;) – Ocramius

답변

5

내 해석은 당신이 정말로 두 가지 질문을하고 있다는 것입니다. ZF2의 모듈은 기본적으로 그냥 PHP 네임 스페이스, 그래서 Foo\Bar라는 이름의 모듈은 완벽하게 수용하고, 기본적으로 찾습니다 모듈 로더가 module/Foo/Bar 다음 vendor/Foo/Bar에서 모듈 클래스입니다. 예를 들어

, 당신은 모루와 네임 스페이스 한국 전기에서 모듈을 생성하기를 원한다면, 당신은 디렉토리 module/Acme/Anvil를 생성하고, 내부에 Module.php 파일을 만들 것입니다 :에서

<?php 
namespace Acme\Anvil; 

class Module 
{ 
    /* module class code goes here */ 
} 

를 응용 프로그램의 config/application.config.php 당신은 Acme\Anvil를 추가 modules 키 :

return array(
    'modules' => array(
     'Application', 
     'Acme\Anvil', 
    ), 
    // Remaining bits of config array are unchanged 
); 

(2) 동적 로딩 모듈

,617,451 당신이 즉석에서 호스트 이름에 따라 구성을 수정하는 사이트의 부트 스트랩 index.php을 수정하는 것입니다 걸릴 수

한 가지 방법.

<?php 
return array(
    'modules' => array(
     'Application', 
     // Other modules common to all sites go here 
    ), 
    'sites' => array(
     'site-one.mydomain.com' => array(
      'modules' => array(
       'ModuleOne', 
       'ModuleTwo', 
      ), 
     ), 
     'site-two.mydomain.com' => array(
      'modules' => array(
       'ModuleThree', 
      ), 
     ), 
    ), 
    // Remaining bits of config array are unchanged 
); 

우리가 public/index.php에 약간의 수정이 config/application.config.php에서로드 구성 배열을 가로 챌 수 있도록이 작업을하고 modules 키 재구성 : 예를 들어, ZendSkeletonApplication를 사용하여 그렇게처럼 application.config.php 파일을 설정합니다

// Pick host out of request 
$hostname = $_SERVER['HTTP_HOST']; 

// Load application configuration 
$applicationConfig = require 'config/application.config.php'; 

// Merge site-specific modules into loaded modules array 
$applicationConfig['modules'] = array_merge(
    $applicationConfig['modules'], 
    $applicationConfig['sites'][$hostname]['modules'] 
); 

// Run the application! 
Zend\Mvc\Application::init($applicationConfig)->run(); 

이 방법은 특정 호스트 이름에 대해로드 된 모듈을 변경하는 쉬운 방법을 제공하지만, 쉽게 사이트의 특정 구성 파일 자동 로딩 및 사이트 특정 모듈 디렉토리뿐만 아니라 수 있도록 확장 할 수 있습니다.

+0

멋진 아이디어가 2 개 있습니다. 나는 그것이 어떻게 진행되는지보고 할 것이다. 이 방법을 사용하면하지만, 잘못된 뷰로드 1 (예를 들어, 귀하의 제안에, 그것은 한국 전기는/인덱스/색인/정지 모루의 컨트롤러를로드하는 동안 '에 대한 뷰를 찾을 것이다) 그러나 그것은 고정 할 수 있습니다 확장 된 templateInjecter가 있습니다. –

+0

경고 : $ _SERVER [ 'HTTP_HOST']는 CLI에서 실행할 때 사용할 수 없습니다. 그렇지 않으면 이것은 훌륭한 아이디어입니다! – Julian