You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony表单确认提交后getClickedButton()返回null问题求助

问题原因

你手动调用form.submit()提交表单时,浏览器不会把点击的提交按钮的name和value参数一起发送给后端。而Symfony正是依靠这些参数识别哪个按钮被点击的,所以$form->getClickedButton()会返回null,进而触发报错。

解决方案

有两种简单的修复方式:

方式一:触发按钮原生点击事件

不用手动提交表单,用户确认后直接触发按钮的原生点击行为,浏览器会自动带上按钮参数:

$(document).on('click', '[data-button-confirm]', function (e) {
    e.preventDefault();
    var $this = $(this);

    alertify.confirm('Confirmation', $(this).data('button-confirm'),
        function () {
            // 触发按钮原生click事件,代替手动提交表单
            $this.get(0).click();
        },
        function () {
            $(this).blur();
        }
    ).set('labels', {
        ok: '<i class="fa fa-check"></i> Confirm',
        cancel: '<i class="fa fa-times"></i> Cancel'
    }).set('defaultFocus', 'cancel');
});

方式二:添加隐藏字段传递按钮信息

如果不想触发原生点击,可以在表单里动态添加隐藏字段,把按钮的name和value传递给后端:

$(document).on('click', '[data-button-confirm]', function (e) {
    e.preventDefault();
    var $this = $(this);
    var $form = $this.parents('form');

    alertify.confirm('Confirmation', $(this).data('button-confirm'),
        function () {
            // 移除可能存在的同名隐藏字段
            $form.find('input[name="' + $this.attr('name') + '"]').remove();
            // 添加隐藏字段携带按钮信息
            $form.append($('<input>', {
                type: 'hidden',
                name: $this.attr('name'),
                value: $this.attr('value')
            }));
            // 提交表单
            $form.submit();
        },
        function () {
            $(this).blur();
        }
    ).set('labels', {
        ok: '<i class="fa fa-check"></i> Confirm',
        cancel: '<i class="fa fa-times"></i> Cancel'
    }).set('defaultFocus', 'cancel');
});
验证

修改后,后端Symfony代码里的$form->getClickedButton()->getName()就能正常获取按钮名称,不会再出现Call to a member function getName() on null的错误。

内容的提问来源于stack exchange,提问作者Lolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:55:05