2016-08-22 15 views
0

Service ManagerでZend 3のドキュメントを読んでいましたが、この問題が発生しました。ドキュメントでZend3でサービスマネージャを使用する正しい方法

、それは我々のコントローラにいくつかのDIを持っている場合、我々はmodule.config.phpファイルを更新し、コントローラキーを追加していないInvokableFactory::classではなく、カスタムファクトリクラスでコントローラを起動し、クラスの配列を含む別のキーservice_managerを追加する必要があることを述べている私の最初のコントローラが使用します。

[OK]を私はそれを行うよう:

class Controller1Factory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     return new Controller1(
      $container->get(Controller2::class), 
      $container->get(Controller3::class), 
     ); 
    } 
} 

Controller1Factory.php

がmodule.config.php

'service_manager' => [ 
     'factories' => [ 
      Controller\Controller2::class => Factory\Controller2Factory::class, 
      Controller\Controller3::class => Factory\Controller3Factory::class, 
     ], 
    ], 
'controllers' => [ 
     'factories' => [ 
      Controller\Controller1::class => Factory\Controller1Factory::class 
     ], 
    ] 

をしかし、今、私は、コントローラ2とコントローラ3はまた、その中でDIを持っているというエラーが発生しています私は自分のモデルに着くまで、新しいカスタム工場を作ります。

また、モデルにはコントローラに注入された依存関係があります。コントローラには、\Zend\Db\TableGateway\TableGatewayInterfaceというZendネイティブがあり、今度はconfファイルを編集してTableGatewayInterfaceを追加する必要があります。

それは間違っています。私は決してネイティブのzendクラスとサービスをこの方法で注入するべきではありません。

どうしたのですか?

+0

問題の内容が不明です。あなたのモデルはコンストラクタに注入する必要がある他のクラスを必要としますが、サービスマネージャを使用してクラスをインジェクトする必要はありません。もしそうなら、どんな方法が好きですか? –

+0

@TimFountainよく私のモデルは\ Zend \ Db \ TableGateway \ TableGatewayInterfaceインスタンスを必要とし、私はそれを私のモデルのコンストラクタに注入しています。しかし、これは、私はその特定のインターフェイスのサービスマネージャーに新しい価値を挿入することが良いとは分かりませんzendのインターフェイスです。 – madeye

+0

コントローラーをコントローラーに挿入しないでください。モデルの依存関係を持つすべてのコントローラに対して別々のファクトリクラスを作成し、それぞれが必要とするモデルを注入します。 – dualmon

答えて

1

コントローラに依存性がない場合は、それをmodule.config.phpに宣言するのが最良の方法です。

しかし、依存関係がある場合は、Module.phpで行う方が良いです。

public function getServiceConfig() 
{ 
    return [ 
     'factories' => [ 
      Model\MyObjectTable::class => function($container) { 
       $tableGateway = $container->get(Model\MyObjectTableGateway::class); 
       return new Model\MyObjectTable($tableGateway); 
      }, 
      Model\MyObjectTableGateway::class => function($container) { 
       $dbAdapter = $container->get(AdapterInterface::class); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Model\User()); 
       return new TableGateway('myObject', $dbAdapter, null, $resultSetPrototype); 
      }, 
     ] 
    ]; 
} 

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

そして、あなたのコントローラで:あなたは、まず、それが依存サービスを注入し、コントローラ(module.config.phpからそれを削除することを忘れないでください)、その後、あなたのサービスを宣言

private $table; 

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

ことがありますThis ZF3 tutorial page and followingに記載されている。

+1

工場用のクロージャを使用することはお勧めできません。 opcodeをキャッシュすることはできず、マージされたconfig配列をキャッシュすることはできません。実稼働環境では、常に具体的なファクトリを作成して、それをモジュールのconfigファクトリセクションで参照する必要があります。 – dualmon

+1

@dualmonこれはZendが "Album" tutorielでそれを実装する方法です。しかし、 "深い"教会では、彼らはあなたが言うようにします。私はZF3も学んでいます。あなたのコメントは私のアプリケーションを具体的な工場で書き直すという考えを与えてくれます。ありがとう。 –

+0

あなたはそれを解決したらあなたの答えを更新するかもしれませんか?それから私はそれをupvoteすることができます。 – dualmon

関連する問題