AbstractType によって拡張された FormType からサービスにアクセスしようとしています。どうやってやるの?
ありがとう!
以前の回答/コメントに基づく完全な回答として:
フォーム タイプからサービスにアクセスするには、次のことを行う必要があります。
1)フォーム タイプをサービスとして定義し、必要なサービスを挿入します。
# src/AppBundle/Resources/config/services.yml
services:
app.my.form.type:
class: AppBundle\Form\MyFormType # this is your form type class
arguments:
- '@my.service' # this is the ID of the service you want to inject
tags:
- { name: form.type }
2) フォーム タイプ クラスで、コンストラクターに挿入します。
// src/AppBundle/Form/MyFormType.php
class MyFormType extends AbstractType
{
protected $myService;
public function __construct(MyServiceClass $myService)
{
$this->myService = $myService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$this->myService->someMethod();
// ...
}
}
コンストラクターを介してフォームタイプに必要なサービスを注入するだけです。
class FooType extends AbstractType
{
protected $barService;
public function __construct(BarService $barService)
{
$this->barService = $barService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$this->barService->doSomething();
// (...)
}
}
フォームタイプをサービスとして宣言する方法については、 sympfonyドキュメントのこのページを参照してください。そのページには、多くの優れたドキュメントと例があります。
Cyprian は正しい方向に進んでいますが、リンクされたページでは、フォーム タイプをサービスとして作成し、DI コンテナーにサービスを自動的に挿入させることで、さらに一歩進んでいます。