PAYATHON 2026

修改 payment status 按钮时报 Creating default object 错误

支付小周

结论

报错的直接原因是控制器使用了未定义的变量 $paid:

$paid->paid = Input::get('paid');

查询得到的订单对象保存在 $order 中,应该改成:

$order->paid = Input::get('paid');
$order->save();

视图中的条件判断也有问题:

@if($order->paid = 0)

这里的 = 是赋值运算符,并不是比较运算符。判断是否相等时,应使用 == 或 ===。

修正控制器

public function ordersPaidSubmit($orderId)
{
    $order = Order::where('order_id', $orderId)->first();

    if (!$order) {
        App::abort(404);
    }

    $order->paid = Input::get('paid');
    $order->save();

    return Redirect::to('/orders')
        ->with('message', 'Payment status updated.');
}

也可以用 firstOrFail() 简化订单不存在时的处理:

public function ordersPaidSubmit($orderId)
{
    $order = Order::where('order_id', $orderId)->firstOrFail();

    $order->paid = Input::get('paid');
    $order->save();

    return Redirect::to('/orders')
        ->with('message', 'Payment status updated.');
}

能否直接使用 firstOrFail(),要看项目采用的 Laravel 和 Eloquent 版本。旧版本可以保留 App::abort(404) 的写法。

修正视图

{{ Form::open() }}
    @if ($order->paid == 0)
        <button
            type="submit"
            class="btn btn-primary"
            name="paid"
            value="1">
            Mark Order as Paid
        </button>
    @else
        <button
            type="submit"
            class="btn btn-primary"
            name="paid"
            value="0">
            Mark Order as Unpaid
        </button>
    @endif
{{ Form::close() }}

如果 paid 字段已经转换为布尔值,条件可以写得更直接:

{{ Form::open() }}
    @if (!$order->paid)
        <button type="submit" class="btn btn-primary" name="paid" value="1">
            Mark Order as Paid
        </button>
    @else
        <button type="submit" class="btn btn-primary" name="paid" value="0">
            Mark Order as Unpaid
        </button>
    @endif
{{ Form::close() }}

更紧凑的按钮写法

两个按钮只有提交值和文字不同,可以合并成一个:

{{ Form::open() }}
    <button
        type="submit"
        class="btn btn-primary"
        name="paid"
        value="{{ $order->paid ? 0 : 1 }}">
        {{ $order->paid ? 'Mark Order as Unpaid' : 'Mark Order as Paid' }}
    </button>
{{ Form::close() }}

还需要检查的事项

表单需要提交到包含 $orderId 的正确路由。当前的 Form::open() 没有指定提交地址。如果页面地址并非处理付款状态更新的路由,控制器可能无法收到正确的订单编号。具体写法要与项目的路由定义一致,例如:

{{ Form::open([
    'url' => 'orders/' . $order->order_id . '/payment-status',
    'method' => 'post'
]) }}

服务端也不能完全信任按钮提交的值,最好只接受 0 和 1:

$paid = Input::get('paid');

if (!in_array((string) $paid, ['0', '1'], true)) {
    App::abort(422);
}

$order->paid = (int) $paid;
$order->save();

页面中只有一个按钮时,可以省略 id="paid"。如果同一页面显示多条订单,而每条订单都使用相同的 id,就会出现重复的 HTML id。表单提交依靠的是 name="paid",与 id 无关。

备注:内容仅供参考。