엔티티 관련 렌더러를 반환하여 팩터 역할을하는 뷰 도우미가 있습니다.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를 사용하고 싶지 않습니다.)