2017-07-11 9 views
0

が、それはObservationFactoryが呼び出されていないようにも、私はここZend Frameworkの2コントローラ、IコントローラにのServiceLocatorをpasssingています私の工場からFactroyInterface

があるモジュールのmodule.config.phpファイルに含まれているようです私ObservationController.php

class ObservationController extends AbstractActionController 
{ 
    private $em; 
    public function __construct($ob) 
    { 
     $this->em = $ob->get('doctrine.entitymanager.orm_default'); 
    } 

ここではObservationFactory.php

class ObservationFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $controller = new ObservationController($serviceLocator->getServicelocator()); 
     return $controller; 
    } 
} 

とModule.config.php

01であります
'controllers' => array(
    'factories' => array(
     'Observation\Controller\ObservationController' => 'Observation\Controller\ObservationFactory' 
    ), 
    'invokables' => array(
      'Observation\Controller\Observation'=> Controller\ObservationController::class 
    ), 
), 

Missing argument 1 for Observation\Controller\ObservationController::__construct(), called in S:\xampp\htdocs\v3\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php on line 207 and defined in S:\xampp\htdocs\v3\module\Observation\src\Observation\Controller\ObservationController.php on line 47

Notice: Undefined variable: ob in S:\xampp\htdocs\v3\module\Observation\src\Observation\Controller\ObservationController.php on line 49

Fatal error: Uncaught Error: Call to a member function get() on unknown in

+1

をあなたにあなたのコントローラー工場エントリを変更するとどうなりますか'ObervationController :: class => ObervationControllerFactory :: class'?たぶんあなたのinvokablesはあなたの工場に問題があります。コントローラー配列内のinvokablesセクションを省略するとどうなりますか? – Marcel

+0

はい、invokablesが問題であり、それを取り除いて今工場が動作します –

+0

エンティティマネージャを取得するためだけにあなたのコントローラに 'ServiceLocatorInterface'を注入しているので、なぜあなたは適切な依存関係注入を使用せず、代わりにエンティティマネージャをコントローラに注入します? – boesing

答えて

2

あなたObservationControllerは、コンストラクタで引数を取っているとして、あなたはこれ以上invokablesとしてあなたのコントローラを呼び出す必要はありません。それはうまくいかないでしょう。呼び出し可能なクラスは引数で構築できないためです。

あなたのコントローラの引数が必要なときはいつでも、そのコントローラのファクトリを既に作成したものにする必要があります。あなたはこの構造体を使用し、ZF3のためにあなたのコードを準備したい場合は、単に以下の

'controllers' => array(
    'factories' => array(
     'Observation\Controller\Observation' => 'Observation\Controller\ObservationFactory' 
    ), 
    'invokables' => array(
     // 'Observation\Controller\Observation'=> Controller\ObservationController::class 
    ), 
), 
2

としてinvokablesキーの下にObservationControllerを非表示にしたり、削除します。

return [ 
    'controllers' => [ 
     'aliases' => [ 
      'Observation\Controller\Observation' => Observation\Controller\ObservationController::class, 
     ], 
     'factories' => [ 
      Observation\Controller\ObservationController::class => Observation\Controller\ObservationControllerFactory::class, 
     ], 
    ], 
]; 
+0

新しいファクトリパターンを実装するためにファクトリを変更する必要があるため、これでは不十分です: 'public function __invoke(ContainerInterface $ container、$ requestedName、array $ options = null);' – boesing

+0

はい、FactoryInterfaceはServiceManager 2.このカスタムインターフェイスは、両方の場合に使用できます。 'interface FactoryInterface { public function __invoke(/ * ContainerInterface */$ container); } ' –

+0

彼は' __invoke'メソッドと 'createService'メソッドを実装するだけで、互換性があります。彼は 'createService'を' __invoke'にコピーし、 'createService'から' return $ this($ serviceLocator、Controller \ ObservationController :: class); ' – boesing

関連する問題