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 导致批量赋值异常的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4.1 _token 表单提交错误

如何使用 ajax 在 laravel 5 中发布表单?

使用 jQuery AJAX 从 Laravel 5 中的联系表单发送电子邮件

Laravel 和 Vue 身份验证表单在登录失败时重新加载

Laravel提交表单具有相同的输入名称ajax

如何使用 Laravel API 在 AngularJS 表单中发送 csrf_token()?