Open2

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

tanaka_tarotanaka_taro

次のような方法がある

  • form_startattrdata-action の設定をする
  • Action(data-action="live#action”) を使う

form_startattrdata-action の設定をする

参考になる資料は次。

https://symfony.com/bundles/ux-live-component/current/index.html#forms

form_startattrdata-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 classbuilder では、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”) を使う

参考になる資料は次。

https://symfony.com/bundles/ux-live-component/current/index.html#forms

次のような感じで、コンポーネント側の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>
tanaka_tarotanaka_taro

次の change log が、過去からの変更についてまとまってて良かった。

https://github.com/symfony/ux-live-component/blob/2.x/CHANGELOG.md#2160

この中でも、次について確認する。

[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 の方にもエラーは見受けられない。ここら辺を調査する。

参考になりそうな資料

https://symfony.com/bundles/StimulusBundle/current/index.html

次のデモの中でも、debounceのような記述はなく、連続してボタンを押すとvotesが複数回上がる
https://ux.symfony.com/demos/live-component/voting

次のデモでも debounce のような記述はない。
https://ux.symfony.com/demos/live-component/invoice

debounce、出来ないんじゃあないかって疑ってる。stimulus側でdebounceさせて、それからaction呼び出したほうが楽。