2016-10-23 34 views
0

私はZendFramework3の新機能で、(モジュールクラス内の)ファクトリのserviceManager以外の引数を持つ関数を呼び出すことができるかどうかを知りたいだけです。 (それは$sm引数に次の引数を渡すことは可能ですか?)ZF3 - ファクトリのモジュールクラスのパラメータを持つ関数を呼び出す

//class Module 

//getConfig() 
//getServiceConfig() 

public function getControllerConfig() 
{ 
    return [ 
     'factories' => [ 
      Controller\ModuleController::class => function ($sm) { 
       return new ModuleController($sm); 
      } 
     ] 
    ]; 
} 
+0

これはv2のSMですが、とにかく次のものを決定します...あなたの特定の問題を貼り付けることができますか? – tasmaniski

+0

私は特に問題はありません。私は、プロジェクトのすべてのモジュールで動作する汎用コードを作成するソリューションを探しています。主な目標は、すべてのモジュール(各ModuleTableのファクトリ、各ModuleTableGatewayのファクトリ、...すべてのモジュールで動作する1つのファクトリだけをパラメータ化することです)を作成することではありません。どのモジュールが自分のコードで操作されているかを知るために私のコントローラから正しいオブジェクト(クラス)を得るために$ this-> getServiceLocator()を使用することはできません。関数($ sm、$ another)** – Renaud

答えて

0

あなたが(確かに)限り、クラスを作成するよう優雅に引数を処理することができ、工場に他の引数を渡すことができます。以下の例では、コントローラディレクトリ内にファクトリクラスが作成されています。これは、ModuleControllerをインスタンス化するFactory(ModuleControllerFactory)になりました。

<?php 

    namespace Application\Controller; 

    use Application\Controller\ModuleController, 
     Zend\ServiceManager\Factory\FactoryInterface, 
     Zend\ServiceManager\Factory, 
     Interop\Container\ContainerInterface; 

    class ModuleControllerFactory implements FactoryInterface { 

     public function __invoke(ContainerInterface $container, $requestedName, array $options=null){ 
      // WE WANT TO PASS $variable1 to $variable12 TO THE ModuleController 
      $variable1  = "Variable Value 1"; 
      $variable2  = "Variable Value 2"; 
      $variable3  = "Variable Value 3"; 
      return new ModuleController($container, $variable1, $variable2, $variable3); 
     } 
    } 

だから、今、私たちはModuleControllerクラスのコンストラクタを作成することができます。

<?php 

    // FILE-NAME: ModuleController.php; 
    namespace Application\Controller; 
    use Interop\Container\ContainerInterface; 

    class ModuleController extends AbstractActionController { 
     /** 
     * ContainerInterface. 
     * @var ContainerInterface 
     */ 
     public $container; 

     /** 
     * @var string 
     */ 
     public $var1; 

     /** 
     * @var string 
     */ 
     public $var2; 

     /** 
     * @var string 
     */ 
     public $var3; 

     // CONTAINER & VARIALBLES INJECTED IN CONSTRUCTOR 
     public function __construct(ContainerInterface $container, $variable1=null, $variable2=null, $variable3=null) { 
      $this->container = $container; 
      $this->var1   = $variable1; 
      $this->var2   = $variable2; 
      $this->var3   = $variable3; 
     } 

     // JUST PLAY WITH THE INJECTED VALUES IN THE INDEX ACTION 
     public function indexAction() { 
      return new ViewModel([ 
       'container' => $this->container, 
       'var1'  => $this->var1, 
       'var2'  => $this->var2, 
       'var3'  => $this->var3 
      ]); 
     } 


    } 

そして今、あなたのモジュール例のconfigフォルダ内module.config.phpを更新:module/Application/config/module.config.php

<?php 

    namespace Application; 

    use Zend\Router\Http\Literal; 
    use Zend\Router\Http\Regex; 
    use Zend\Router\Http\Segment; 
    use Zend\ServiceManager\Factory\InvokableFactory; 

    return [ 
      //... 
     'router' => [ 
      //... 
     ], 
     'controllers' => [ 
      'factories' => [ 
       Controller\ModuleController::class => Controller\ModuleControllerFactory::class 
      ] 
     ] 
      //... 

    ]; 
1

あなたが 、すべての依存関係のための1つの「魔法」ファクトリを作成したい場合は、SM AbstractFactoryを見てみるべきでしょう。

その1つの工場では、$ requestedNameから何が依存関係になるかチェックできます。たとえば。クラスのコンストラクタから依存関係を読み込み、その依存関係を挿入する(または$ containerから再度取り出す)ことができます。また、依存関係をconfigに設定して、すべてのクラスに対して1つのファクトリだけを作成することもできます。

+0

ええ、これは私が必要とするものです。ありがとう、ちょっとだけ、彼らはServiceManagerの作成場所を指定していません。 $ serviceManager = new ServiceManager([ 'factories' => [ MyObjectA :: class => MyObjectFactory]という名前のサービスマネージャを作成します。 :: class、 MyObjectB :: class => My ObjectFactory :: class ] ]); – Renaud

+0

フレームワークを使用している場合は、デフォルトで作成されます。インストール後にZFスケルトンを確認してください。https://github.com/zendframework/ZendSkeletonApplication index.phpファイルを見てください。 – tasmaniski

+0

フレームワークを使用していますZendSkeletonを使用しました。しかし、私はindex.phpファイルを見ましたが、それは私にserviceManagerについて何も示していません。あなたが私にそれがどこにあるかを示すことができるなら、本当に喜ぶでしょう:)ありがとう – Renaud

関連する問題