Laravel:如果传递未知字段,如何使更新无效

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。我想将字段限制为我的规则中提到的字段。

Chi*_*ung 2

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()仅从您的规则中检索字段。