如何验证请求数据,验证后将另一个推送到数组并在 Laravel 6 中以一种很好的方式创建对象

我想验证数据,然后在验证后创建 slugs 并以一种很好的方式创建对象。


这不是我要排除的解决方案:


public function store()

{

 data = request()->validate([

   'name_en' => 'required',

   'name_de' => 'required'

 ]);

 $data['slug_en'] = Str::slug(request()->name_en);

 $data['slug_de'] = Str::slug(request()->name_de);


 Post::create( $data );   

}

我喜欢以这种方式达到同样的效果:


public function store()

{

Post::create( request()->validate([

  'name_en' => 'required',

  'name_de' => 'required'

]) );


//where to place slugs creation?


}


守候你守候我
浏览 118回答 2
2回答

慕少森

在 Laravel 中可以做到这一点的一个好方法是使用Form Requests。您可以为您的请求创建一个扩展 FormRequest 类的类(假设您StorePost为此示例调用它)。在这个类中,您可以使用该rules方法来放置您的验证规则,如下所示:public function rules(){    return [        'name_en' => 'required',        'name_de' => 'required',    ];}要添加slug_密钥,您可以使用prepareForValidation 方法。该方法可用于通过该merge方法向请求中添加数据,例如:protected function prepareForValidation(){    $this->merge([        'slug_en' => Str::slug($this->name_en),        'slug_de' => Str::slug($this->name_de)    ]);}因为这发生在验证之前,您甚至可以在方法中为您的slug_键添加验证。rules()所以要实际使用这个类,你可以简单地使用 Laravel 魔法在你的控制器方法中输入类名。您真正整洁的控制器现在可以如下所示:public function store(StorePost $request){    Post::create($request->all()); // or specify the keys you want inside the `all()` method    // ...}就这么简单!表单请求的验证实际上会在控制器方法运行之前发生,因此您可以确定验证的数据是正确的。当然,您可以在表单请求类中添加您想要的任何方法,因此有许多不同的方法可以实现这一点,例如使用getPostData返回包含 slug 值的数组的方法。

HUH函数

Laravel 有一个名为TransformsRequest的类;它可以自动过滤和处理您请求中的每个字段。我认为您可以创建一个类似的中间件SlugStrings.php并扩展 TransformsRequest。所以每个请求的键值都会被slug.创建app/Http/Middleware/SlugStrings.php文件:namespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\TransformsRequest;use Illuminate\Support\Str;class SlugStrings extends TransformsRequest{    /**     * The names of the attributes that should be slug.     *     * @var array     */    protected $only = [        'name_en',        'name_de',    ];   /**     * Transform the given value.     *     * @param  string  $key     * @param  mixed  $value     * @return mixed     */    protected function transform($key, $value)    {        if (in_array($key, $this->only, true)) {            return is_string($value) ? Str::slug($value) : $value;        } else {            return $value;        }    }}将此中间件添加到app/Http/Kernel.php:    protected $middleware = [        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,        ...        // Add it here:        \App\Http\Middleware\SlugStrings::class,        ...    ];现在你不能对字段name_en和做任何事情name_de,只需从请求中创建它们:public function store(){Post::create( request()->validate([  'name_en' => 'required',  'name_de' => 'required']) );}这很容易。所以下次你有另一个领域时,你想打它。只需将其添加到$only属性中。
打开App,查看更多内容
随时随地看视频慕课网APP