
mapped:false / property_path:false
$form->get('foo')->setRequired(false)b. イベントで
required オプション変更PRE_SET_DATA で初期値を見て分岐csrf_protection:false
allow_extra_fields:true で未知キー無視error_bubbling:true
error_mapping
label_format:'form.%name%' + translation_domain:'admin'
%name% がフィールド名に置換entry_options['label'=>false] + prototype:true/親:by_reference:false
allow_add, allow_delete
post_max_size_message:'ファイルが大きすぎます'
FileType の constraints も要追加setMethod('POST') + hidden _method
$form->setAction($url)
setAction() は Builder でも可validation_groups => fn(FormInterface $f) => $f->getData()->isDraft() ? ['Draft'] : ['Default']row_attr / label_attr または $builder->setAttribute()
getter:'isPublished', setter:'markPublished'
empty_data:'' + trim:false
getBlockPrefix() を上書きsetValidationGroups()/POST_SUBMIT で再評価$builder->setAttribute('enctype','multipart/form-data')FileType があれば自動設定されるが念のためaddXxx() 実装 + by_reference:false
cascade も確認validation_groups:['Partial']
fetch → JSON エラー返却label_html:true, help_html:true
も使えるform_attr:['novalidate'=>'novalidate']
add('group', FormType::class,['label'=>false]) 内に子フィールドcompound:true でネスト可能choice_loader:null + 配列順に choices 指定preferred_choices で先頭固定placeholder:'---- 選択 ----'required:false にしないと選択不可years: range(date('Y'), date('Y')+5)query_builder で WHERE e.deletedAt IS NULL
translation_domain:'errors' + 各 invalid_message はキーで指定disabled:truesetDataMapper(new CustomMapper())attr:{id:'my_custom_id'}addEventSubscriber(new DynamicFieldSubscriber($repo))PRE_SET_DATA でループ追加Views: 2
