大きなコードのため、ファイルを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つのリンクを追加するには十分な評判がありません。だから、私はクラスへのいくつかのリンクを削除する必要があります。しかし、それらのすべてが私の要点で見つけることができます。
興味深い。そのようにフォーマットされたエラーメッセージを見たことはありません。いずれにしても、HalykEntityコンテナを認識させたという理由だけで、コンテナが自動的に挿入されるわけではありません。一般的な規則として、エンティティにコンテナへのアクセス権を持たせたくありません。リファクタリングに対するさまざまなアプローチ。 Banking :: makeRefunding($ entity)を考慮すると、ほとんどの処理が銀行業務に移行するでしょう。 – Cerad
あなたのタイトル質問に答えるために、フォームビルダーはコンテナーを使用して他のフォームタイプをロードしますが、エンティティーについては何も知らず、作成する必要がある場合は単純な新規作成を行います。問題を回避するには、コントローラにエンティティを作成し、フォームビルダーに渡す前にsetContainerを呼び出します。お勧めしませんが、この特定の問題を過ぎてしまうでしょう。 – Cerad
@セラードはい、そうです。私はBanking :: makeRefunding($ entity)を呼び出すことができます。しかし、いつ私たちが銀行業務をリファクタリングしなければならないのでしょうか?このサービスのすべての呼び出しを検索してリファクタリングする必要がありますか?私の意見では、ディコンテナの目的はこの種の変更を残すことです。 –