コントローラー内にいる場合は、次を使用して構成パラメーターを簡単に読み取ることができます。
$this->container->getParameter('profession');
しかし、フォームタイプなど、他のクラスにいる場合、どうすれば構成パラメーターを取得できますか?
$container = new Container();
$container->getParameter('profession');
上記のコードは機能しないはずであり、機能しません。
コントローラー内にいる場合は、次を使用して構成パラメーターを簡単に読み取ることができます。
$this->container->getParameter('profession');
しかし、フォームタイプなど、他のクラスにいる場合、どうすれば構成パラメーターを取得できますか?
$container = new Container();
$container->getParameter('profession');
上記のコードは機能しないはずであり、機能しません。
別の同様の解決策は、フォーム タイプをサービスにして、必要なパラメーターを挿入することです。次に、コントローラーが行う必要があるのは、サービスを取得することだけです。パラメータ名をパーセント記号で囲みます。
services.xml 内
<service
id = "zayso_area.account.create.formtype"
class = "Zayso\AreaBundle\Component\FormType\Account\AccountCreateFormType"
public = "true">
<argument type="service" id="doctrine.orm.accounts_entity_manager" />
<argument type="string">%zayso_core.user.new%</argument>
</service>
そして、本当にやりたいのであれば、コンテナ全体を注入することもできますが、それはお勧めできません。
簡単な解決策の 1 つは、構成パラメーターの値を格納する新しい変数を Type に与えることです。公開する (推奨されません)、コンストラクター パラメーターを追加する、またはセッターを使用することができます。
class MyType extends AbstractType{
private $profession;
public function __construct($profession){
$this->profession = $profession;
}
// ...
}
これをコントローラーで次のように使用します。
$myType = new MyType($this->container->getParameter('profession'));
// use mytype with form
結局のところ、コンテナをテストしたり交換したりするのが難しくなるため、フォームはコンテナについてまったく認識すべきではありません。これは、コンテナの全体的な考え方に反します。
一方、コンストラクター/セッターを使用してパラメーターを注入することは、テスト時にパラメーターがどこから来たのかを知る必要がなく、必要に応じていつでもソースを変更でき、前述のように依存関係がないため、かなり優れています。コンテナに。
セッター注入を使用することもできます。http://symfony.com/doc/current/book/service_container.html#optional-dependencies-setter-injectionから:
クラスにオプションの依存関係がある場合は、「セッター注入」がより良いオプションになる可能性があります。これは、コンストラクターではなくメソッド呼び出しを使用して依存関係を注入することを意味します。クラスは次のようになります。
namespace AppBundle\Newsletter;
use AppBundle\Mailer;
class NewsletterManager
{
protected $mailer;
public function setMailer(Mailer $mailer)
{
$this->mailer = $mailer;
}
// ...
}
setter メソッドによって依存関係を注入するには、構文を変更するだけです。
# app/config/services.yml
services:
app.mailer:
# ...
app.newsletter_manager:
class: AppBundle\Newsletter\NewsletterManager
calls:
- [setMailer, ['@app.mailer']]