Symfony2.7では、フォームの作成中にコントローラーから直接Form Typeコンストラクターにパラメーターを渡すことができましたが、Symfony3ではできません!
Symfony2.7より前
$form = $this->createForm(new NewsType("posted_by_name"));
Symfony3の後
$form = $this->createForm(NewsType::class); // no idea how to pass parameter?
更新:私もそれにアクセスしたかった:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
// how to access posted_by_name here which is sent from controller
}
どんな助けも大歓迎です。
御時間ありがとうございます!私はこれを自分で解決しました:
NewsTypeコンストラクターからパラメーターを削除し、$ options配列を使用してPostedByフォームフィールドにデータを追加し、コントローラーから$ options配列にデータを渡しました。以下を確認してください。
NewsType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('postedBy', HiddenType::class, array(
'data' => $options['postedBy']
)
)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'postedBy' => null,
));
}
コントローラー
$form = $this->createForm(NewsType::class, $news, array(
'postedBy' => $this->getUser()->getFullname(),
);
PDATE: addEventListenerから$ options配列にアクセスする場合は、以下のコードを使用してください。
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$postedBy = $event->getForm()->getConfig()->getOptions()['postedBy'];
}
それが誰かを助けることを願っています!
form as service を定義する必要があります。
namespace AppBundle\Form\Type;
use App\Utility\MyCustomService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class NewsType extends AbstractType
{
private $myCustomService;
private $myStringParameter;
public function __construct(MyCustomService $service, $stringParameter)
{
$this->myCustomService = $service;
$this->myStringParameter = $stringParameter;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Your code
}
}
サービス構成に追加します。
#src/AppBundle/Resources/config/services.yml
services:
app.form.type.task:
class: AppBundle\Form\Type\NewsType
arguments:
- "@app.my_service"
- "posted_by_name"
tags:
- { name: form.type }
@Muzafarと@jkucharovic、質問はどちらを使用するかです...
Bernard Schussekが Symfony Forms 101 で示しているように:
1 動的データをコンストラクタに渡さないでください。
2 ...ただし、代わりにCustom Optionsを使用します
3 グローバル設定をコンストラクター(またはサービス)に渡します