修改 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 无关。
备注:内容仅供参考。
