为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
守候你守候我 2022-07-22 18:57:13
我想验证数据,然后在验证后创建 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?}
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

在 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 值的数组的方法。


查看完整回答
反对 回复 2022-07-22
?
HUH函数

TA贡献1836条经验 获得超4个赞

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属性中。


查看完整回答
反对 回复 2022-07-22
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号