2017-11-20 8 views
0

엔티티 관련 렌더러를 반환하여 팩터 역할을하는 뷰 도우미가 있습니다.zf2 뷰 도우미 팩토리/서비스 로케이터 매개 변수

나는 FactoryInterface 및 MutableCreationOptionsInterface를 구현하는 공장을하고 싶은, 그래서 그것을 전달 개체의 유형, 예에 따라 서로 다른 렌더러 반환 할 수 있습니다 그러나

$serviceLocator->get('entityRenderer', ['entity' => $user]); // returns UserRenderer 
$serviceLocator->get('entityRenderer', ['entity' => $admin]); // returns AdminRenderer 
$serviceLocator->get('entityRenderer'); // returns DefaultRenderer 

는 servicelocator에 대한 액세스 권한이 없습니다 보기 내에서, 그리고 내가 만든 factory view 도우미가 __invoke 메소드를 사용하여 호출됩니다. 즉, 서비스 관리자를 사용하지 않고 유형 검사가 여기에서 발생하여 특정 렌더러를 반환한다는 것은 바람직하지 않습니다. 예 :

이 "공장"이 단순히 현재보기의 인스턴스를 전달하기 위해 AbstractHelper (보기)를 확장해야하는 것에 유의하십시오.

내이 같은 (개념 증명, 작동하지 않는 코드) "이상적인"다음과 같습니다

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\MutableCreationOptionsInterface; 
class EntityRendererFactory implements FactoryInterface, MutableCreationOptionsInterface{ 
     protected $options = []; 
     protected $renderers = []; 

     public function createService(ServiceLocatorInterface $serviceLocator){ 
      $this->addRenderer($serviceLocator->get('ViewHelperManager')->get('UserRenderer'), User::class); 
      $this->addRenderer($serviceLocator->get('ViewHelperManager')->get('AdminRenderer'), Admin::class); 
      $this->addRenderer($serviceLocator->get('ViewHelperManager')->get('DefaultRenderer'), 'default'); 

      if(!array_key_exists('entity', $this->options)){ 
       return $this->getRenderer('default'); 
      } 

      $entity = $this->options['entity']; 

      foreach($this->getRenderers() as $renderer){ 
       if($renderer->canRender($entity)){ 
        return $renderer; 
       } 
      } 

      //Alternatively, more specific hard-coding interface type check 
      if($entity instanceof User){ 
       return $serviceLocator->get('ViewHelperManager')->get('UserRenderer'); 
      } 
      //etc. 
     } 

     public function setCreationOptions(array $options){ 
      $this->options = $options; 
     } 
    } 

...하지만 위의 시연, 내가 이내에에서 호출하는 방법을 모르는 것 뷰 헬퍼는 일반적으로 서비스 관리자가 아니라 __invoke 메서드에서 호출됩니다.

(ZF3으로 마이그레이션하려면 ServiceLocatorAwareInterface를 사용하고 싶지 않습니다.)

답변

0

당신은 같은 module.config.php의 공장 섹션에서 viewhelper를 선언 할 수

return [ 
    ... 
    'view_helpers' => [ 
     'factories' => [ 
      'entityRenderer' => EntityRendererFactory::class 
     ] 
    ], 
    ... 
] 

는 다음 모델 사용 : 개인적으로

class EntityRendererFactory extends AbstractHelper implement FactoryInterface 
{ 
    private $sm; 
    public function createService(ServiceLocatorInterface $serviceLocator){ 
     $this->sm = $serviceLocator; 
     return $this; 
    } 
    public function _invoke() { 
     // your code 
    } 
} 

, 나는 단지를 포함하는 특정 서비스 관리자를 작성하여 시작 필요한 수업을 듣고 수업에 기록한 것은이 수업입니다.

$this->sm = $servicelocator->getServiceLocator()->get('mySpecificSM'); 

덧붙여이 모델은 viewhelper 클래스를 빌드하는 팩토리 클래스가 필요한 ZF3에서는 작동하지 않습니다. 너무 복잡하지 않은 변화.