2017-09-14 5 views
1

大きなコードのため、ファイルをgistに書きました。symfonyフォームビルダーはコンテナを使用していますか?

説明:私のAPIバンドルの

BankControllerは、銀行からのPOSTリクエストを聞きます。コントローラが必要な変数を取得すると、HalykTypeを使用してHalykEntityフォームを構築しようとします。

すべてが正常でフォームが検証された場合、コントローラは操作タイプ(資金調達/払い戻し)によって適切なメソッド(makeFunding/makeRefunding)を呼び出すHalykEntityのmakeOperationメソッドを呼び出そうとします。

これらの両方(makeFunding/makeRefundingメソッド)は、バンキングバンドルのバンキングサービスメソッドを呼び出すことがあります。

問題:

{ 
"error": { 
    "code": 500, 
    "message": "Internal Server Error", 
    "exception": [ 
     { 
      "message": "Call to a member function get() on null", 
      "class": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError", 
      "trace": [ 
       { 
        "namespace": "", 
        "short_class": "", 
        "class": "", 
        "type": "", 
        "function": "", 
        "file": "src\\ApiBundle\\v1\\Entity\\HalykEntity.php", 
        "line": 308, 
        "args": [] 
       }, 
       { 
        "namespace": "ApiBundle\\v1\\Entity", 
        "short_class": "HalykEntity", 
        "class": "ApiBundle\\v1\\Entity\\HalykEntity", 
        "type": "->", 
        "function": "makeFunding", 
        "file": "src\\ApiBundle\\v1\\Entity\\HalykEntity.php", 
        "line": 274, 
        "args": [] 
       }, 
       { 
        "namespace": "ApiBundle\\v1\\Entity", 
        "short_class": "HalykEntity", 
        "class": "ApiBundle\\v1\\Entity\\HalykEntity", 
        "type": "->", 
        "function": "makeOperation", 
        "file": "src\\ApiBundle\\v1\\Controller\\BankController.php", 
        "line": 34, 
        "args": [] 
       }, 
       { 
        "namespace": "ApiBundle\\v1\\Controller", 
        "short_class": "BankController", 
        "class": "ApiBundle\\v1\\Controller\\BankController", 
        "type": "->", 
        "function": "indexAction", 
        "file": null, 
        "line": null, 
        "args": [ 
         [ 
          "object", 
          "Symfony\\Component\\HttpFoundation\\Request" 
         ] 
        ] 
       }, 
       { 
        "namespace": "", 
        "short_class": "", 
        "class": "", 
        "type": "", 
        "function": "call_user_func_array", 
        "file": "vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\HttpKernel.php", 
        "line": 153, 
        "args": [ 
         [ 
          "array", 
          [ 
           [ 
            "object", 
            "ApiBundle\\v1\\Controller\\BankController" 
           ], 
           [ 
            "string", 
            "indexAction" 
           ] 
          ] 
         ], 
         [ 
          "array", 
          [ 
           [ 
            "object", 
            "Symfony\\Component\\HttpFoundation\\Request" 
           ] 
          ] 
         ] 
        ] 
       }, 
       { 
        "namespace": "Symfony\\Component\\HttpKernel", 
        "short_class": "HttpKernel", 
        "class": "Symfony\\Component\\HttpKernel\\HttpKernel", 
        "type": "->", 
        "function": "handleRaw", 
        "file": "vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\HttpKernel.php", 
        "line": 68, 
        "args": [ 
         [ 
          "object", 
          "Symfony\\Component\\HttpFoundation\\Request" 
         ], 
         [ 
          "integer", 
          1 
         ] 
        ] 
       }, 
       { 
        "namespace": "Symfony\\Component\\HttpKernel", 
        "short_class": "HttpKernel", 
        "class": "Symfony\\Component\\HttpKernel\\HttpKernel", 
        "type": "->", 
        "function": "handle", 
        "file": "vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\Kernel.php", 
        "line": 171, 
        "args": [ 
         [ 
          "object", 
          "Symfony\\Component\\HttpFoundation\\Request" 
         ], 
         [ 
          "integer", 
          1 
         ], 
         [ 
          "boolean", 
          true 
         ] 
        ] 
       }, 
       { 
        "namespace": "Symfony\\Component\\HttpKernel", 
        "short_class": "Kernel", 
        "class": "Symfony\\Component\\HttpKernel\\Kernel", 
        "type": "->", 
        "function": "handle", 
        "file": "web\\app_dev.php", 
        "line": 29, 
        "args": [ 
         [ 
          "object", 
          "Symfony\\Component\\HttpFoundation\\Request" 
         ] 
        ] 
       } 
      ] 
     } 
    ] 
} 

}

思考:

私は銀行からの呼び出しをシミュレートしようとしています(ポスト要求..AMOUNT=5201&CURRENCY=KZT&TIMESTAMP=20170906173539&TRTYPE=1..を送る) 私はエラーを取得する フォームビルダがDIコンテナを使用しないという問題があると思います。私が間違っている?そうでない場合は、どのように銀行サービス方法を呼び出すことができますか?

P.S.

申し訳ありません申し訳ありませんが、私は2つのリンクを追加するには十分な評判がありません。だから、私はクラスへのいくつかのリンクを削除する必要があります。しかし、それらのすべてが私の要点で見つけることができます。

+0

興味深い。そのようにフォーマットされたエラーメッセージを見たことはありません。いずれにしても、HalykEntityコンテナを認識させたという理由だけで、コンテナが自動的に挿入されるわけではありません。一般的な規則として、エンティティにコンテナへのアクセス権を持たせたくありません。リファクタリングに対するさまざまなアプローチ。 Banking :: makeRefunding($ entity)を考慮すると、ほとんどの処理が銀行業務に移行するでしょう。 – Cerad

+0

あなたのタイトル質問に答えるために、フォームビルダーはコンテナーを使用して他のフォームタイプをロードしますが、エンティティーについては何も知らず、作成する必要がある場合は単純な新規作成を行います。問題を回避するには、コントローラにエンティティを作成し、フォームビルダーに渡す前にsetContainerを呼び出します。お勧めしませんが、この特定の問題を過ぎてしまうでしょう。 – Cerad

+0

@セラードはい、そうです。私はBanking :: makeRefunding($ entity)を呼び出すことができます。しかし、いつ私たちが銀行業務をリファクタリングしなければならないのでしょうか?このサービスのすべての呼び出しを検索してリファクタリングする必要がありますか?私の意見では、ディコンテナの目的はこの種の変更を残すことです。 –

答えて

1

私は私のアーキテクチャをリファクタリングすることに決めました。

理由:私はちょうどベストプラクティスに従って容器全体を渡すためには良い方法ではありませんバンキングサービス

  • を渡す必要があるとき

    1. はなぜ、私のエンティティに容器全体を渡します。 (私はドキュメントへのリンクを見つけることができませんが、私はコンテナインスタンスが本当に巨大であることを覚えていて、メモリの大容量を必要とする)

    ソリューション:私のエンティティクラスで

    、makeFunding /メソッドをmakeRefundingことバンキングサービス

    function makeFunding(IApiBanking $banking): bool { 
        return $banking->makeFunding(); 
    } 
    

    のインスタンスを必要とし、私のコントローラで私はちょうどのような実体法を呼び出しました:

    /** @var HalykEntity $entity */ 
    $entity = $form->getData(); 
    $view = $this->view([ 
        'success' => $entity->makeOperation($this->get('banking')) 
    ], 200)->setTemplate("ApiBundle:v1:Resources:views:layouts:default.html.twig"); 
    
  • 関連する問題