0

나는 ZF2를 배우고있다.getServiceLocator()를 사용하여 모델에서 어댑터를 가져 오는 방법은 무엇입니까?

getServiceLocator()을 사용하여 모델에서 어댑터를 얻을 수 있습니까?

return array(
    'db' => array(
     'driver'   => 'Pdo', 
     'dsn'   => 'mysql:dbname=zf2tutorial;host=localhost', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 
    ), 
    'service_manager' => array(
     'factories' => array(
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
     ), 
     'aliases' => array(
      'db' => 'Zend\Db\Adapter\Adapter', 
     ), 
    ), 
); 

그래서 /config/autoload/local.php

return array(
    'db' => array(
     'username' => 'YOUR USERNAME HERE', 
     'password' => 'YOUR PASSWORD HERE', 
    ), 
); 

은 어떻게 사용할 수 있습니다 /config/autoload/global.php :

$sm = $this->getServiceLocator(); 
$this->dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
Model에서 어댑터를 가져 오는

?

답변

0

최신 Zend Framework 버전을 사용하는 경우 ServiceLocatorAwareInterfaceServiceManagerAwareInterface이 모두 제거되었으므로 컨트롤러 클래스에서 getServiceLocator 메서드를 사용할 수 없습니다.

그래서이 라인 : 당신은 아마 당신의 컨트롤러 클래스에서 예상대로
$sm = $this->getServiceLocator(); 

이 작동하지 않습니다.


는 또한 the migration guide이 변화에 대한 자세한 내용을보실 수 있습니다 :

다음 인터페이스, 특성, 및 클래스가 제거 :

  • ...
  • 젠드 \ ServiceManager에 \ ServiceLocatorAwareInterface
  • Zend \ ServiceManager \ ServiceLocatorAwareTrait
  • 젠드 \ ServiceManager에 \ ServiceManagerAwareInterface

ServiceLocatorAware 및 ServiceManagerAware 인터페이스와 특성을 너무 자주 V2에서 학대 및 서비스 관리자 구성 요소의 목적의 반을 표현했다; 의존성을 직접 주입해야하며 컨테이너는 결코 객체로 구성되어서는 안됩니다.

서비스를 리팩토링해야합니다. 종속성을 주입하는 서비스 팩토리를 만드는 것이 가장 좋은 방법 일 수 있습니다.

팩토리 구축 방법에 대한 자세한 내용은 this blog post (팩터)을 참조하십시오.

2

모델을 만들 때 (예 : 팩토리를 사용하여) 어댑터를 주입해야합니다.

당신의 설정 예를 들면

: 당신은 그때 분명히 모델이를 수용 할 필요가

<?php 
namespace Application\Some; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class ModelFactory implements FactoryInterface 
{ 
    /** 
    * Create service 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return mixed 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $adapter = $serviceLocator->get('Zend\Db\Adapter\Adapter'); 

     return new Model($adapter); 
    } 
} 

:

'service_manager' => array(
    'factories' => array( 
     'Application\Some\Model' => '\Application\Some\ModelFactory' 
    ) 
) 

그런 다음 모델에 어댑터를 삽입합니다 공장을 만들 것 이 경우에는 생성자의 어댑터가 필요합니다.

$serviceLocator->get('Application\Some\Model'); 

이 공장에 전화 어댑터를 갖춘 모델을 다시 가져올 것이다 :

지금 당신은 당신이 전화 줄 주입 된 어댑터 모델의 인스턴스를 얻을 필요가 이제까지 곳.

그런 다음 필요에 따라 컨트롤러 또는 서비스 클래스에 모델을 삽입하는 것과 같은 종류의 접근 방식을 사용합니다. 이전 게시판에서 말했듯이 서비스 로케이터/서비스 관리자를 객체에 직접 삽입하는 것을 피하고 Factory 클래스 등에서 필요한 항목 (어댑터/매퍼 등)을 추가하는 데 사용합니다.