验证或删除laravel中的额外字段

Son*_*Son 21 php forms laravel

是否可以使用其他字段的规则验证请求,或从请求中删除该字段?

简单的例子,我有FormRequest对象的规则:

public function rules() {
        return [
            'id' => 'required|integer',
            'company_name' => 'required|max:255',
        ];
    }
Run Code Online (Sandbox Code Playgroud)

当我得到任何其他字段的发布请求时,我想在控制器中获得错误/异常,或者我想只获取id和company_name字段,而没有任何其他字段.它与laravel中存在任何特征,或者我必须按照我的方式制作它?

Ant*_*hev 17

要从Laravel中的请求中删除密钥,请使用:

$request->request->remove('key')
Run Code Online (Sandbox Code Playgroud)


Can*_*lik 14

使用laravel的帖子请求包含的内容多于表单输入,因此您需要检查请求以查看其中的内容.

要只获取您想要的字段,您可以使用:

$request->only(['fieldname1', 'fieldname2', 'fieldname3']);
Run Code Online (Sandbox Code Playgroud)

要么

$request->except(['fieldnameYouDontWant1', 'fieldnameYouDontWant2', 'fieldnameYouDontWant3']);
Run Code Online (Sandbox Code Playgroud)

排除你不想要的.


小智 6

从 Laravel 5.5 开始,您可以validate直接调用方法,Request例如

class YourController extends Controller
{

    public function store(Request $request) {

      $cleanData = $request->validate([
        'id' => 'required|integer',
        'company_name' => 'required|max:255',
      ]);

      // Now you may safely pass $cleanData right to your model
      // because it ONLY contains fields that in your rules e.g

      $yourModel->create($cleanData);
  }
}
Run Code Online (Sandbox Code Playgroud)


use*_*266 5

从Laravel 5.5开始,您可以在控制器中执行以下操作:

public function store(StoreCompanyRequest $request)
{
    Company::create($request->validated());
}
Run Code Online (Sandbox Code Playgroud)

validated()函数仅返回已验证的字段,并删除其他所有内容。


MrC*_*rot 5

不幸的是,这里的大多数答案都没有抓住原始问题的重点。也就是说,您想在 FormRequest 类中指定需要验证的字段,然后在您的控制器中执行以下操作:

Something::create($request->validated());

但是,您可能想要验证特定字段,但不想将其传递给create控制器中的方法。执行$request->only()or的问题$request->except()是您必须重复 FormRequest 类中的字段,或者在$guarded模型的属性中重复它们。

不幸的是,我发现做你想做的唯一方法如下:

Something::create(collect($request->validated())->forget('field_you_dont_want')->toArray());

2020 年 10 月编辑

感谢 Laravel 论坛上的人们,在 Laravel 7 中 Request 类是可宏化的。所以更好的答案是编辑app/Providers/AppServiceProvider.php并在boot()方法中添加:

// Extend the validated() method
Request::macro('validatedExcept', function($except = []) {
    return Arr::except($this->validated(), $except);
});
Run Code Online (Sandbox Code Playgroud)

你需要添加

use Illuminate\Support\Arr;

到顶部app/Providers/AppServiceProvider.php太。

然后你就可以使用:

$request->validatedExcept(['field_to_ignore', 'another_field_to_ignore']);
Run Code Online (Sandbox Code Playgroud)