2017-12-17 14 views
0

ただの簡単な質問です。私はいくつかのAPIを構築しています。私は、フォームリクエストを処理する簡単な親クラスを作成することを考えていました。親クラスのsymfony 4セッター注入

フォーム要求を簡単に処理したい場合は、このクラスを拡張するだけで、オブジェクトを要求し、そのオブジェクトから抽出したデータを要求し、すぐに使用できるメソッドを多数取得できます。何が、なぜ正確には問題ではありません。

問題がある:

  1. 私は郵便配達を通じてリクエストを送信します。
  2. 親クラスを拡張するクラスでrequestオブジェクトを使用しようとしましたが、要求の代わりにnullが返されます。だからと

    #generic api form controller 
        App\Controller\Api\ApiFormController: 
         calls: 
          - [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']] 
    

    :すべてのコントローラはので、私はこのように、この定義をオーバーライドするサービスとして登録され、デフォルトではどのように私は全部を設定するのです?:symfonyでは今

私はセッター注入を使用していることがわかります。

私は他のクラスのクラスの上に拡張します。それをPostControllerと呼んでみましょう。だから、:

<?php 

namespace App\Controller\Api; 

use Symfony\Component\HttpFoundation\RequestStack; 

class ApiFormController 
{ 
    /** 
    * @var Request 
    */ 
    public $request; 

    /** 
    * @param RequestStack $requestStack  
    */ 
    public function setDependencies(
     RequestStack $requestStack  
    ) { 
     $this->request = $requestStack;  
    } 
} 

そして今のPostController:私はこのようなアクセスを得るために期待していたと私は、このオブジェクトへのアクセスを持っていない理由を私は理解して考える

public function get(int $post = null) 
{ 
    dump($this->request); exit; 
} 

。私はこの目標を可能な限りクリーンな方法で達成する方法をいくつか考えています。私は準備ができた答えを期待していないが、ヒント。

イベントをバックグラウンドで設定することを考えていましたか? 私はサービスとしてコントローラを接続する方法とは関係があるとも思っています。

+0

私はあなたの質問を取得しない - 'PostController'と'との間の接続がどこにありますかApiFormController' - それはサブクラスですか?なぜあなたはそれのために定義されたサービスを持っていないのですか?そして、YMLの呼び出し定義に2つのパラメータが含まれているのはなぜですか?しかし、このメソッドはそのうちの1つのみを使用していますか? –

+0

最後の質問から始めましょう。もっと明確にするためにいくつかのコードを削除しました。私はこの他のサービスを削除することを忘れてしまった。これは問題ではありません。あなたが言及したように、PostControllerはApiFormControllerを拡張しています(最初の2つの文章で言及されています)。 "なぜあなたはそれのために定義されたサービスを持っていないのですか?" - 何のために?全体の機能性は?アイデアは私が拡張できるコントローラーを持つことであり、そのコントローラーは必要なすべてのサービスを注入することになります。それは、デフォルトで私の要求を処理します。それ以上の説明が必要ですか? – Robert

+0

親クラスのみにサービス定義があり、サブクラスには定義されていない場合、サービス定義は親クラスにのみ使用されます。あなたのサブクラスにサービスを注入したいのであれば、そのサービス定義を書く必要があります。http://symfony.com/doc/current/service_container/parent_services.html –

答えて

1

それをすべてのコア:symfonyは、サブクラスのためのサービス定義をピックアップしていません。したがって、クラスの依存関係を定義して別のクラスに継承する場合は、この第2クラスの依存関係も定義する必要があります。

最も簡単な方法は、あなたの例は、次のように動作しますので、このためにparentキーワードを使用することです:

App\Controller\Api\ApiFormController: 
    calls: 
     - [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']] 

PostController: 
    parent: App\Controller\Api\ApiFormController 
+1

Brilliant!ありがとう! – Robert

+0

あなたは大歓迎です! –

-1

ここにいくつかの問題があります。

  1. このように依存関係を注入する場合は、コントローラをサービスとして定義する必要があります。あなたはhereをもっと読むことができます。

    # config/routes.yaml 
    get_something: 
        path: /
        defaults: { _controller: App\Controller\Api\PostController:get } 
    

    また、あなたがサービス、ないApiFormControllerとしてのPostControllerを定義する必要があります:

ルーティングは次のようなものでなければなりません。

  1. RequestStackを注入しましたが、属性のタイプヒントはリクエストです。

の代わりに:あなたが使用する必要が

$this->request = $requestStack; 

$this->request = $requestStack->getMasterRequest(); 
+0

申し訳ありませんが、すべてが間違っています。まず第一に、配線が問題であるとは言いませんでした。それ以外の理由は分かりませんが、コントローラが自動的にサービスとして定義されていると言いました。リクエストについて:リクエストのタイプヒントはどこにありますか?コメントは間違っていますが、それは問題の一部ではありません!コメント(あなたが読んでいない)で言及したように、私はコードを不必要なコードから取り除くために少しリファクタリングしました。私はいくつかの断片を欠いていました。私は両方のコントローラをサービスとして持っている必要があり、mainStackStackオブジェクトへのアクセスが必要です。 – Robert

関連する問題