Laravel 5:持久化表单数据时,_token 导致批量赋值异常
Posted
技术标签:
【中文标题】Laravel 5:持久化表单数据时,_token 导致批量赋值异常【英文标题】:Laravel 5: when persist form data, _token causes mass assignment exception 【发布时间】:2015-06-13 11:24:47 【问题描述】:当我尝试持久化表单数据时,Laravel 抛出了一个批量赋值异常。
在我使用!! form::open(...) !!
的视图中,我知道它创建了_token
作为隐藏字段。
当表单数据发送到控制器时,我正在使用
$data = Input::all();
$order = Order::create($data);
$order->save();
我应该在我的数据库中为_token
添加一个字段吗?还是我做错了其他事情导致了错误?
【问题讨论】:
不要使用批量分配,创建一个函数,将 $request 对象作为参数并将所需的内容分配给模型。它会给你一个地方来列出你的字段,就好像它是 $fillable 属性一样,而且(a)你可以获得更大的灵活性,并且(b)你可以在需要时在项目中搜索所有函数调用。我在使用批量分配时遇到的问题是 $fillable 数组应该根据用户角色而有所不同。我希望我不会首先使用批量分配。 当您调用Order::create($data);
时它会保存,之后您不必save()
它。这是不使用质量分配的另一个原因。您可以控制保存模型的位置。
【参考方案1】:
质量分配异常通常是因为您没有在模型中指定fillable
(或相反的guarded
)属性。这样做:
class Order extends Eloquent
protected $fillable = ['field1', 'foo', 'bar'];
这样您也不必担心_token
,因为无论您向模型传递什么其他内容,都只会填充指定的字段并将其保存在数据库中。
【讨论】:
这样可以吗?Class Order extends Model protected $table = 'orders'; protected $fillable = ['field1', 'foo', 'bar'];
是的。当然,您应该指定您的实际属性,而不是 field1
等。这只是一个例子。【参考方案2】:
或
protected $guarded = array();
【讨论】:
【参考方案3】:确保将 $fillable 或 $guarded 放在 app\Order.php 文件中,而不是 app\Http\Controllers\OrderController.php 文件中。
【讨论】:
【参考方案4】:回答您最初的问题。你会想做 unset($request['_token']);在创建之前。
【讨论】:
以上是关于Laravel 5:持久化表单数据时,_token 导致批量赋值异常的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery AJAX 从 Laravel 5 中的联系表单发送电子邮件