2013-05-14 6 views
0

내 응용 프로그램은 데이터 매퍼 패턴을 사용하므로 데이터베이스 어댑터의 인스턴스가 필요한 여러 매퍼 클래스가 있습니다. 그래서 내 서비스 설정의 factories 부분은 다음과 같은 항목으로 가득 :맞춤 서비스 탐지기로 서비스 구성 중복을 줄입니까?

'UserMapper' => function($sm) { 
    $mapper = new UserMapper(); 
    $adapter = $sm->get('Zend\Db\Adapter\Adapter'); 
    $mapper->setAdapter($adapter); 

    return $mapper; 
}, 
'GroupMapper' => function($sm) { 
    $mapper = new GroupMapper(); 
    $adapter = $sm->get('Zend\Db\Adapter\Adapter'); 
    $mapper->setAdapter($adapter); 

    return $mapper; 
}, 

내가이 보일러 플레이트 코드의 일부를 제거하고 싶습니다. 정의가 일부 사용자 정의 팩토리 구성과 함께 존재하지 않는 한, DB 어댑터를 suppliyng하여 모든 매퍼 클래스를 인스턴스화 할 수있는 이러한 매퍼에 대해 사용자 정의 서비스 로케이터 클래스를 정의 할 수 있습니까?

답변

4

이 접근하는 방법은 두 가지가 있습니다.

먼저 맵퍼가 Zend\Db\Adapter\AdapterAwareInterface을 구현하고 인터페이스를 구현하는 모든 서비스에 어댑터를 삽입하는 초기화 프로그램을 서비스 관리자에 추가합니다. 그렇게하면 매퍼마다 invokables 키 설정을 대신 할 수 있습니다.

귀하의 맵퍼는 모두 invokables 아래 매퍼를 배치하고 AdapterAware 서비스

return array(
    'invokables' => array(
     // .. 
     'Foo/Mapper/Bar' => 'Foo/Mapper/BarMapper', 
     // .. 
    ), 
    'initializers' => array(
     'Zend\Db\Adapter' => function($instance, $sm) { 
      if ($instance instanceof \Zend\Db\Adapter\AdapterAwareInterface) { 
       $instance->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter')); 
      } 
     }, 
    ), 
); 

대체 방법은 대한 초기화를 추가, 서비스 관리자 설정에서이

<?php 
namespace Foo\Mapper; 

use Zend\Db\Adapter\Adapter; 
use Zend\Db\Adapter\AdapterAwareInterface; 
// if you're using php5.4 you can also make use of the trait 
// use Zend\Db\Adapter\AdapterAwareTrait; 

class BarMapper implements AdapterAwareInterface; 
{ 
    // use AdapterAwareTrait; 

    // .. 
    /** 
    * @var Adapter 
    */ 
    protected $adapter = null; 

    /** 
    * Set db adapter 
    * 
    * @param Adapter $adapter 
    * @return mixed 
    */ 
    public function setDbAdapter(Adapter $adapter) 
    { 
     $this->adapter = $adapter; 

     return $this; 
    } 

} 

유사 것이다 MapperAbstractServiceFactory을 만들려면이 답변 ->ZF2 depency injection in parent이 어떻게 수행되는지 설명되어 있습니다.

+0

고마워요! 두 가지 옵션을 추가로 살펴 보겠습니다. –