now*_*wox 5 php validation laravel
我有一个自定义验证器:
$validator = Validator::make($request->all(), [
'name' => 'sometimes|unique:stock.containers|max:255',
]);
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我想抛出一个错误:
PUT:localhost/my/model?description=foobar
Run Code Online (Sandbox Code Playgroud)
因为我只想接受name这种情况。然后我会确保我的$validator->valid()仅包含接受的字段。
这是我的控制器:
class ContainerController extends Controller
{
public function update($id, Request $request) {
$container = Container::find($id);
$rules = ['name' => 'max:255'];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json($validator->errors(), 422); //i'm not getting any
}
$container->update($validator->valid());
}
}
Run Code Online (Sandbox Code Playgroud)
通过上述请求,我到达了$container->update。我想将字段限制为我的规则中提到的字段。
validate您可以使用控制器的内置方法,而不是创建一个新的 Validator 实例。
public function update($id, Request $request) {
$valid = $this->validate($request, [
'name' => 'max:255',
]);
dd($valid);
}
Run Code Online (Sandbox Code Playgroud)
所以即使有人提交了规则中未包含的其他参数,也不会被包含在内。
在我们的例子中,如果您执行上述的curl 请求,$valid将返回一个空数组。
然后你可以检查数组是否为空:
if (empty($valid)) {
// Do what you want
}
Run Code Online (Sandbox Code Playgroud)
我注意到您正在使用Container::find($id);,但您也可以在路线文件中使用内置模型绑定:
Route::put('your-path/{container}', 'ContainerController@update');
Run Code Online (Sandbox Code Playgroud)
代替
Route::put('your-path/{id}', 'ContainerController@update');
Run Code Online (Sandbox Code Playgroud)
这将允许在您的控制器中执行此操作:
public function update(Container $container, Request $request)
{
// $container would be the Container instance already
}
Run Code Online (Sandbox Code Playgroud)
如果你仍然想创建一个新的 Validator 实例,你可以这样做:
$validator = \Validator::make($request->all(), $rules);
if ($validator->fails()) {
// ...
}
if (! $valid = $validator->validated()) {
// Nothing has been validated
}
Run Code Online (Sandbox Code Playgroud)
基本上,您应该使用$validator->validated()而不是$validator->valid()仅从您的规则中检索字段。