我有一个具有以下验证规则的用户控制器:
public function store(Request $request)
{
...
$this->validate($request, [
'name' => 'required',
'email' => 'email|required|unique:users',
'password' => 'confirmed|max:32|min:8|required',
'roles' => 'exists:roles,id|required',
]);
$user = new User();
$user->fill($request->all());
...
}
My User.php模型将可填充属性定义为:
protected $fillable = ['name', 'email'];
要通过confirmed
验证,我必须在POST请求中发送password
和password_confirmation
个字段。
在开发过程中一切正常,但在单元测试中我遇到了数据库错误。它尝试将数据插入password_confirmation列。它就像忽略了$fillable
数组。
我知道“测试之间的laravel losts事件处理程序”错误/问题(https://github.com/laravel/framework/issues/1181)。所以我想我可能会错过调用Model::boot()
之外的一些模型函数(我在测试的User::boot()
函数中调用setUp()
)。
谢谢,
阅读Model.php源代码,我发现有人在setUp()函数之后和测试之前调用Model::unguard()
https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L2180。如果我在测试开始时调用User::reguard()
,但是(我不知道为什么),unguard()和reguard()函数被多次调用,测试变得非常慢。
答案 0 :(得分:2)
发现问题:v5.0.x中的基本播种机只调用了Model :: unguard()(https://github.com/laravel/laravel/blob/v5.0.22/database/seeds/DatabaseSeeder.php#L15),同时更新了v5.1.x并添加了对Model :: reguard()的调用(https://github.com/laravel/laravel/blob/v5.1.0/database/seeds/DatabaseSeeder.php#L19)(我使用的是v5.0.22)。
答案 1 :(得分:1)
Fillable仅适用于MassAssignment。当您创建新实例时,就像上面所做的那样,您不会触发质量分配事件。
你可以这样做: 无论如何,如果你正在创建用户,你也可以这样做:
$user = User::create($request->all);
如果您只想实例化用户而不保留数据,则可以执行以下操作:
$user = new User($request);