[symfony/Form] Formで保存する処理のいくつかの方法

次のような方法がある
-
form_start
のattr
にdata-action
の設定をする - Action(data-action="live#action”) を使う
form_start
の attr
に data-action
の設定をする
参考になる資料は次。
form_start
の attr
に data-action
の設定をする 方法は資料の中には次のように書いてある。
{{ form_start(form, {
attr: {
'data-action': 'live#action:prevent',
'data-live-action-param': 'save'
}
{{ form_widget(form.submit_save, {attr: {class: 'button is-success'}}) }}
}) }}
上記の様にすると、コンポーネント側の save
アクションが呼び出される。
FormType class
の builder
では、submit_save と名付けたボタンを追加してる。
$builder->add('submit_save', SubmitType::class, [
'label' => 'save'
]);
少し注意。
しかし、私の環境では動作しなかった。コンポーネントの save
メソッドすら呼び出されない。
さらに資料の方を確認すると、次のような記述があった。
The data-live-action-param attribute way of specifying the action was added in Live Components 2.16. Previously, this was done with data-action-name.
composer.lock
内でバージョンを確認してみると、v2.12.0
との事で、これが原因で動作しない者と思われる。
バージョンを上げる方法で対応する場合、単純に composer update
をして通った。
バージョンを上げない方法の場合、data-action-name
の方を使うと良い。具体的には次のように記述する。
{{ form_start(form, {
attr: {
'data-action': 'live#action:prevent|debounce(300)',
'data-action-name': 'save'
}
}) }}
Action(data-action="live#action”) を使う
参考になる資料は次。
次のような感じで、コンポーネント側のsaveアクションを呼び出す事が出来る。
<button
data-action="live#action"
data-live-action-param="addItem"
data-live-id-param="{{ item.id }}"
data-live-item-name-param="CustomItem"
>Add Item</button>
コントローラ側に引数も渡している。ux-live-component
の過去バージョンよりもシンプルな書き方になったと思う。過去バージョンの場合、次のように記述していた。
<button class="delete" type="button"
data-action="live#action"
data-action-name="debounce(300)|delete(key={{ item.id }})"
>save</button>

次の change log が、過去からの変更についてまとまってて良かった。
この中でも、次について確認する。
[BC BREAK] The data-action-name attribute behavior was removed in favor of using Stimulus "action parameters" and data-live-action-param. This is a breaking change if you were using the data-action-name attribute directly in your templates. #1418
私の環境では、button に data-live-action-param="debounce(300)|add"
と設定しても、正常にdebounce が効いていない。
chrome の dev tool の方にもエラーは見受けられない。ここら辺を調査する。
参考になりそうな資料
次のデモの中でも、debounceのような記述はなく、連続してボタンを押すとvotesが複数回上がる
次のデモでも debounce のような記述はない。
debounce、出来ないんじゃあないかって疑ってる。stimulus側でdebounceさせて、それからaction呼び出したほうが楽。