2016-07-25 4 views
0

を与えなしのインスタンスでなければならない私は、次のコントローラがあります。Zendの2注入:キャッチできる致命的なエラー::: __構築物()someControllerに渡される引数1の...

namespace Application\Controller; 

use Application\Model\Person; 
use Zend\Mvc\Controller\AbstractActionController; 
use Application\Model\PersonTable; 

class PersonController extends AbstractActionController 
{ 
    private $table; 

    public function __construct(PersonTable $table) 
    { 
     $this->table = $table; 
    } 
    // other methods 
} 

を私がやってみましたここでのドキュメントに従って、インジェクション:モジュール/アプリケーション/ Module.phpで

https://docs.zendframework.com/tutorials/getting-started/database-and-models/

私はこの機能を追加しました:

public function getControllerConfig() 
    { 
     return [ 
      'factories' => [ 
       Controller\PersonController::class => function($container) { 
        return new Controller\PersonController(
         $container->get(Model\PersonTable::class) 
        ); 
       }, 
      ], 
     ]; 
    } 
をモジュール/アプリケーション/設定/ module.config.phpで

それは私のコントローラを持っているでしょうので、私は、これを変更:

'controllers' => array(
     'invokables' => array(
      'Application\Controller\Index' => 'Application\Controller\IndexController', 
      'Application\Controller\Person' => 'Application\Controller\PersonController' 
     ), 
    ), 

私はコンソールからコントローラメソッドを呼び出すとエラーが表示されます。

キャッチ可能な致命的なエラー:引数1がApplication \ Controller \ PersonControlに渡されました ler :: __ construct()はApplication \ Controller \ PersonTableのインスタンスでなければなりません。 neはE:\ other \ dropbox \ dropbox \ programavimas \ kodo pavyzdziai \ htdoc \ zend_2_staff_register \ vendor \ zendframework \ zendframework \ library \ Zend \ ServiceM anager \ AbstractPluginManager.phpは170行目で、E:¥other¥dropbox¥Droに定義されています pbox \ programavimas \ kodo pavyzdziai \ htdocs \ zend_2_staff_register \ module \ Applicati on \ src \ Application \ Controller \ PersonController.php on line 12

なぜ注射しないのですか?工場:

答えて

1

あなた宣言しているので、あなたの

'Application\Controller\Person' => 'Application\Controller\PersonController' 

invokablesクラスとしては、キーにそれを設定する必要があります。

あなたは、このようにそれをやった:

public function getControllerConfig() 
    { 
     return [ 
      'factories' => [ 
       Controller\PersonController::class => function($container) { 
        return new Controller\PersonController(
         $container->get(Model\PersonTable::class) 
        ); 
       }, 
      ], 
     ]; 
    } 

ZF2でコンフィグがそのようにマージされPersonControllerは終わりinvokablesによってロードされると、このコードが無駄になっています。

私は、オブジェクトファクトリではない匿名関数を作成することを助言し、この宣言:このオブジェクトPersonControllerFactoryがあなたの正しい依存関係を使用して、コントローラのインスタンスを返します

'controllers' => array(
      'invokables' => array(
       'Application\Controller\Index' => 'Application\Controller\IndexController', 
      ), 
      'factories' => array(
       'Application\Controller\Person' => 'Application\Factory\PersonControllerFactory' 
      ), 
     ), 

を。

ここコントローラの工場の例(サービスの工場と同じではない): https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/src/Blog/Factory/PostControllerFactory.php

その設定ライン

https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/config/module.config.controllers.php#L8
関連する問題