2017-02-27 7 views
0

두 엔드 포인트가있는 컨트롤러가있는 Zend Framework 3 MVC 앱이 있습니다. 둘 다 동일한 클래스에 액세스해야합니다. 그것은이 클래스의 인스턴스 같은 컨트롤러 클래스의 속성 수 있도록하는 것하는 것이 작업을 수행하는 가장 좋은 방법처럼 보인다 : 그러나생성자에 매개 변수가있는 ZF3 MVC 프레임 워크 컨트롤러를 사용할 수 있습니까?

class IndexController extends AbstractActionController 
{ 
    /** 
    * var Utility $utility 
    */ 
    protected $utility; 


    public function __construct(Utility $utility) 
    { 
     $this->utility = $utility; 
    } 

    public function indexAction() 
    { 
     $this->utility->doA('param1'); 
     return new ViewModel(); 
    } 

    public function otherAction() 
    { 
     $results = $this->utility->validateRequest($this->request); 
     if ($results) 
     { 
      return new ViewModel(); 
     } 
     else 
     { 
      throw new Exception('Invalid request'); 
     } 
    } 
} 

을, 나는에 PARAMATERS을 전달하는 방법을 모른다 Zend Framework가 "만들어내는"부분을 알지 못하기 때문에 생성자로 사용합니다.

답변

1

젠드 프레임 워크는 Dependency Injection이라는 개념을 사용합니다. 이것은 SOLID, dependency inversion에있는 D를 기반으로합니다. 이론은 제쳐두고, modules.config.php에서 컨트롤러를위한 커스텀 팩토리를 만들어야합니다. 또한 calld 유틸리티 클래스에 대한 팩토리를 만들어야합니다.

먼저 무엇보다도 composer create-project -sdev zendframework/skeleton-application과 비슷한 명령으로 프로젝트를 만들었을 것입니다. 그랬다면 아마도 최신 버전의 Service Manager가 없을 것입니다. 파일 vendor/bin/generate-factory-for-class이 있는지 확인하십시오. 그렇지 않다면 composer update zendframework/zend-servicemanager을 실행하여 거기에 추가하십시오.

이제 유틸리티 클래스에 대한 팩토리를 만들 수 있습니다. 그것의 가정은 module/Application/src/Service/Utility.php이고 이름 공간은 Application\Service입니다. 그냥 vendor/bin/generate-factory-for-class Application\\Service\\Utility > module/Application/src/Service/UtilityFactory.php을 입력하면됩니다. 해당 파일을 보면 당신은 볼 수 있습니다

public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    return new Utility(); 
} 

지금 vendor/bin/generate-factory-for-class Application\\Controller\\IndexController > module/Application/src/Controller/IndexControllerFactory.php와 컨트롤러의 동일한 작업을 수행 할 수 있습니다. 이 공장을 열고 조금 더 복잡한 것을보십시오.

public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    return new IndexController($container->get(\Application\Service\Utility::class)); 
} 

$container은 의존성 주입 컨테이너입니다. 호출 될 때이 팩토리에서 __invoke 명령을 실행합니다.

남은 한 가지 더 남았습니다. module.config.php를 편집해야합니다. 이제 설정에 다음 섹션을 추가

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => Controller\IndexControllerFactory::class, 
    ], 
], 

와 라인

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => InvokableFactory::class, 
    ], 
], 

교체 :

'service_manager' => [ 
    'factories' => [ 
     Service\Utility::class => InvokableFactory::class, 
    ], 
], 

그런 다음 컨트롤러가 작동합니다.