亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何驗證請求數據,驗證后將另一個推送到數組并在 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 關注
  • 109 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號