2017-02-27 7 views
0

私は、2つのエンドポイントを持つコントローラを備えたZend Framework 3 MVCアプリを持っています。どちらも同じクラスにアクセスする必要があります。コンストラクタにパラメータを持つZF3 MVCフレームワークコントローラを使用できますか?

class IndexController extends AbstractActionController 
{ 
    /** 
    * var Utility $utility 
    */ 
    protected $utility; 


    public function __construct(Utility $utility) 
    { 
     $this->utility = $utility; 
    } 

    public function indexAction() 
    { 
     $this->utility->doA('param1'); 
     return new ViewModel(); 
    } 

    public function otherAction() 
    { 
     $results = $this->utility->validateRequest($this->request); 
     if ($results) 
     { 
      return new ViewModel(); 
     } 
     else 
     { 
      throw new Exception('Invalid request'); 
     } 
    } 
} 

しかし、私はPARAMATERSを渡す方法がわからない:これを行うための最善の方法は、このクラスのインスタンスこのようなコントローラクラスのプロパティを作ることであろうことであろうように思えますZend Frameworkがどこにそれを「作る」のか分からないからです。

答えて

1

Zend FrameworkはDependency Injectionという概念を使用します。これは、SOLIDののDに基づいています。理論はさておき、modules.config.phpであなたのコントローラ用のカスタムファクトリを作る必要があります。また、calldユーティリティのクラスのファクトリを作成する必要があります。

まず、composer create-project -sdev zendframework/skeleton-applicationのようなコマンドでプロジェクトを作成したことがあります。もしあなたがそうしたのであれば、おそらく最新バージョンのService Managerを持っていないでしょう。ファイルvendor/bin/generate-factory-for-classが存在するかどうかを確認してください。そうでない場合は、composer update zendframework/zend-servicemanagerを実行してそこに追加します。

ここで、ユーティリティクラスのファクトリを作成します。それはmodule/Application/src/Service/Utility.phpにあり、名前空間Application\Serviceを持っています。あなたはvendor/bin/generate-factory-for-class Application\\Service\\Utility > module/Application/src/Service/UtilityFactory.phpと入力してください。あなたは、そのファイルを見ると、あなたが見ることができます:

public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    return new Utility(); 
} 

は今vendor/bin/generate-factory-for-class Application\\Controller\\IndexController > module/Application/src/Controller/IndexControllerFactory.phpとコントローラのために同じことを行うことができます。この工場を開き、もう少し複雑なものを見てください。

public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    return new IndexController($container->get(\Application\Service\Utility::class)); 
} 

$containerは、依存性注入容器です。呼び出されると、これらのファクトリで__invokeコマンドを実行します。

もう1つ残されたこと。あなたはあなたのmodule.config.phpを編集する必要があります。今、設定に次のセクションを追加し

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => Controller\IndexControllerFactory::class, 
    ], 
], 

でライン

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => InvokableFactory::class, 
    ], 
], 

を交換してください:

'service_manager' => [ 
    'factories' => [ 
     Service\Utility::class => InvokableFactory::class, 
    ], 
], 

は、その後、あなたのコントローラが動作するはずです。

関連する問題