2016-11-25 10 views
1

내 컨트롤러를위한 공장을 구현하기 위해 노력하고있어 :젠드 3 공장 인터페이스

class NumberControllerFactory implements FactoryInterface{ 
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    return new NumberController($container->get(Bar::class)); 
} 

public function createService(ServiceLocatorInterface $services) 
{ 
    return $this($services, NumberController::class); 
} 

}

있어 I 오류 : 나는 주입 원하기 때문에 나는이 필요

Fatal error: Declaration of Number\Factory\NumberControllerFactory::__invoke() must be compatible with Zend\ServiceManager\Factory\FactoryInterface::__invoke(Interop\Container\ContainerInterface $container, $requestedName, array $options = NULL) in C:\xampp\htdocs\MyProject\module\Number\src\Number\Factory\NumberControllerFactory.php on line 10 

Zend 3의 컨트롤러에서 서비스 관리자가 제거 되었기 때문에 모델에서 컨트롤러로 변경되었습니다.

01에 설명 된 스켈레톤을 사용했습니다. composer.json에서

은 다음과 같습니다,

https://zendframework.github.io/zend-servicemanager/migration/

이 coould 당신은 나를 도와 :

"require": { 
    "php": "^5.6 || ^7.0", 
    "zendframework/zend-component-installer": "^1.0 || ^0.3 || ^[email protected]", 
    "zendframework/zend-mvc": "^3.0.1", 
    "zfcampus/zf-development-mode": "^3.0" 
}, 

나는이 문제를 이해하지 않는, 내가 예를 들어 자습서를 많이 읽고, 부디?

나는 현재이 방법은 :: __ 컨트롤러에 모델을 주입하기위한

답변

3

를 호출 젠드 \ ServiceManager에 \ 공장 \ FactoryInterface와 호환되는지 생각, 당신은 공장 클래스를 만들 필요가 module.config.php의 구성과 동안 아래

'controllers' => [ 
    'factories' => [ 
     Controller\AlbumController::class => Factory\AlbumControllerFactory::class, 
    ], 
], 

여기서 AlbumController는 Album 모듈의 컨트롤러 클래스입니다. 그런 다음 \ Album \ src \ Factory 모듈 안에 AlbumControllerFactory 클래스를 만들어야합니다. 당신은 컨트롤러 클래스 (AlbumController) 내부에 아래의 코드를 작성해야

namespace Album\Factory; 

    use Album\Controller\AlbumController; 
    use Album\Model\AlbumTable; 
    use Interop\Container\ContainerInterface; 
    use Zend\ServiceManager\Factory\FactoryInterface; 


    class AlbumControllerFactory implements FactoryInterface 
    { 
    public function __invoke(ContainerInterface $container,  $requestedName, array $options = null) 
    { 
     return new AlbumController($container->get(AlbumTable::class)); 
    } 
    } 

:이 클래스에서 당신은 아래의 코드를 작성해야합니다.

public function __construct(AlbumTable $album) { 
    $this->table = $album; 
    } 

이렇게하면 모델 클래스를 컨트롤러 클래스에 삽입 할 수 있습니다.

0

감사합니다. Azhar. 내가 사용하는 경우 때문에

내 문제가 있었다 : 문서에

'Number\Controller\Number' => \Number\Factory\NumberControllerFactory::class 

내가 사용해야한다는 것입니다 : 작동되지

  'factories' => array(
     \Number\Controller\NumberController::class => \Number\Factory\NumberControllerFactory::class 
    ) 

, 내가 사용했다 ... (404)이 있었다 전체 클래스 이름 :: 클래스.

누군가 작동하지 않는 이유를 아는 사람이 있습니까?

+0

당신은 belwo 코드 '수 \ 컨트롤러 \ 번호'=> 공장 \ NumberControllerFactory :: 클래스 또는 컨트롤러 \ NumberController :: 클래스 => 공장 \ NumberControllerFactory :: 클래스를 사용할 수 있습니다 –