2013-02-26 2 views
5

ZF2 스켈레톤을 기반으로 새 프로젝트 용 새 ZF2 응용 프로그램을 설정하기 시작했으며 Models에 대한 자습서를보고 있습니다.ZF2 모듈간에 공유되는 모델

tl; dr : 여러 다른 모듈 사이에서 더 높은 수준 (외부/모듈)의 어딘가에 모델을 배치하려면 어떻게해야합니까?

우리는 여러 모듈 설정과 같이이 있습니다

/ 
/module/ModuleName 
/module/ModuleName/config 
/module/ModuleName/src 
/module/ModuleName/src/ModuleName 

난 그냥 폴더 /module/ModuleName/src/ModuleName/Model/TableName.php 설정에 대해,하지만 그때 깨달았 : 해당 테이블뿐만 아니라 다른 모듈에 액세스 할 수 있도록해야합니다. 그래서 내가 무엇을해야하니?

Models 폴더를 /module/Model에두면 좋을까요, 즉 모듈 (현재 설정에 따라 site/model)로 처리 될 것입니다.

장소간에 모델을 복사하여 붙여 넣어야합니까? 어딘가에 /vendor/library/Company/Model에 모델을 다시 붙여야합니까? 이것에 대한 모범 사례가 있는지 확실하지 않습니다!

질문 2 :이 튜토리얼에서는 ServiceManager를 사용하여 동일한 인스턴스를 사용하도록 데이터베이스 모델을 인스턴스화하는 방법을 제안합니다. 5 개의 컨트롤러가있는 모듈을 각 컨트롤러가 완전히 별개의 테이블 (4 개의 테이블 각각)에 액세스하는 경우 어떻게됩니까? 그것은 나에게 그것이 각 페이지로드 (모듈의 다른 컨트롤러에 대한)에 16 개의 테이블을 중복으로 초기화하는 것으로 보입니다. 단일 테이블 초기화는 페이지로드에 55ms를 추가합니다. 이 주변에 방법이 있습니까 ?? 내가 튜토리얼이 테이블 게이트 웨이를 초기화하는 것을 기반으로 컨트롤러의 액션으로 설정을 어떻게 옮길 지 확신하지 못한다.

답변

8

1)

당신은 당신의 응용 프로그램에서 모든 모듈에서 모든 모델을 사용할 수 있습니다, 그래서 그들은 "공유"할 수 있습니다. 예를 들어 ServiceManager를 사용하면 프로젝트에서 모델 (및 다른 클래스)의 인스턴스를 가져올 수 있습니다.

서비스 관리자 구성 :

'factories' => array(
    'AuthService' => function($sm) { 
     $auth = new \Zend\Authentication\AuthenticationService(); 

     return $auth; 
    }, 
    'RoleMapper' => function($sm) { 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $mapper = new \Application\Mapper\RoleMapper; 
     $mapper->setDbAdapter($dbAdapter); 
     $mapper->setEntityPrototype(new \Application\Model\Role); 
     $mapper->setHydrator(new \Application\Model\RoleHydrator); 

     return $mapper; 
    }, 
    'UserMapper' => function($sm) { 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $mapper = new \MyModule\Mapper\UserMapper; 
     $mapper->setDbAdapter($dbAdapter); 
     $mapper->setEntityPrototype(new \MyModule\Model\User); 
     $mapper->setHydrator($sm->get('UserHydrator')); 

     return $mapper; 
    }, 
    .... 

당신은 당신이 거기에 정의 된 여러 개의 모듈에서 클래스를 가질 수 있습니다 볼 수 있듯이. 일반적으로 각 모듈에 대해 별도의 ServiceManager 구성을 정의 할 수 있습니다.

가이처럼 응용 프로그램 모듈 내부 "UserMapper"의 인스턴스를 만들기에서 당신을 중지 아무것도 :

일부 컨트롤러 :

$this->getServiceLocator()->get('UserMapper'); 
// Or even grab Zend libraries like this 
$this->getServiceLocator()->get('AuthService'); 

는 ServiceManager에 당신은 어떤에서 클래스의 인스턴스를 잡을 수 있습니다 문제가있는 다른 모듈 내부에있는 모듈의 당신이 그것을 요청할 때까지

2)

서비스 매니저는 실제로 아무것도의 인스턴스를하지 않습니다, 그래서 당신이 제안으로 오버 헤드가 없습니다.

$this->getServiceLocator()->get('UserMapper'); // instance now created. 

당신이 다음에 인스턴스가 생성되지 않으며, 예를 들어 "RoleMapper"에 대한 서비스 관리자를 요구하지 않을 경우 : 위의 예에서

, 당신은 첫 번째를 요청할 때까지 인스턴스가 실제로 만들어지지있다.

+0

답장을 보내 주신 Andrew에게 감사드립니다. 당신 말이 맞아요. # 2, 나는 wincachegrind에서 잘못된 것을보고있는 것처럼 보입니다. 좋은 소식! 몇 가지 튜토리얼에서'UserMapper'를 많이 보았습니다 - 단지 예제일까요, 아니면 실제 ZF2일까요? # 1에 관해서는 : 그래서 만약에'Manufacturing \ Model \ WorkflowTable '=> function ($ sm) {..}'을 등록하면,'$ this-> getServiceLocator() -> get() 'Manufacturing \ Model \ WorkflowTable')'다른 라이브러리에 있습니까? 모델을 기본 모듈로 사용하는 것이 더 표준적인 방법일까요 ?? – Benno

+0

예, 모든 모듈에서 호출 할 수 있습니다. 모든 Service Manager 구성이 결합되어 모든 모듈에서 아무 것도 가져올 수 없습니다. – Andrew

+0

UserMapper는 제가 사용했던 예일뿐입니다. 사람들이 DataMapper 매퍼를 사용하는 일반적인 시나리오입니다. 패턴 – Andrew