【问题标题】:Laravel: How to use multiple validation rules with requestsLaravel:如何对请求使用多个验证规则
【发布时间】:2020-07-17 09:41:18
【问题描述】:

我有两个型号 UserProfile 一切正常,完美地创造了记录。

为了验证,我创建了如下请求类。

用户请求

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Validator;
use function __;
use function preg_match;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     * @todo set role based permission for the method
     *
     */
    public function authorize()
    {
        return TRUE;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        Validator::extend(
            'without_spaces',
            function ($attr, $value) {
                return preg_match('/^\S*$/u', $value);
            },
            __('validation.username_space')
        );

        switch ($this->method()) {

            case 'POST':

                return [
                    'username' => 'required|string|without_spaces|max:255|unique:users',
                    'email'    => 'required|string|email|max:255|unique:users,email',
                    'password' => 'required|string|min:8|confirmed',
                    'role'     => 'required',
                ];

            case 'PUT':
            case 'PATCH':

                return [
                    'username' => 'sometimes|required|string|without_spaces|max:255|unique:users,username,' . $this->user->id,
                    'email'    => 'required|string|email|max:255|unique:users,email,' . $this->user->id,
                    'password' => 'nullable|string|min:8|confirmed',
                    'role'     => 'required',
                ];

            case 'GET':
            case 'DELETE':
            default:
                return [];
                break;
        }

    }
}

个人资料请求

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use function __;
use function preg_match;

class ProfileRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return FALSE;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        Validator::extend('unique_field', function ($attributes, $value, $parameters, $validator) {
            return;
        },
            __('validation.username_space')
        );

        switch ($this->method()) {

            case 'POST':
            case 'PUT':
            case 'PATCH':

                return [
                    'first_name' => 'max:20',
                    'last_name'  => 'max:20',
                    'mobile'     => 'regex:/(01)[0-9]{9}/|digits:8 ',
                    'city'       => 'max:30',
                    'facebook'   => 'url',
                    'twitter'    => 'url',
                    'youtube'    => 'url',
                    'instagram'  => 'url',
                ];

            case 'GET':
            case 'DELETE':
            default:
                return [];
                break;
        }
    }
}

用户控制器

public function store(UserRequest $request)
{
    // begin transaction
    DB::beginTransaction();

    try {
        // create user
        $user = User::create([
            'username' => $request->username,
            'email'    => $request->email,
            'password' => Hash::make($request->password),
            'role'     => $request->role,
        ]);

        // set profile data
        $profile = new Profile([
            'first_name' => $request->first_name,
            'last_name'  => $request->last_name,
            'mobile'     => $request->mobile,
            'city'       => $request->city,
            'facebook'   => $request->facebook,
            'twitter'    => $request->twitter,
            'youtube'    => $request->youtube,
            'instagram'  => $request->instagram,
        ]);

        // save profile data
        $user->profile()->save($profile);

        // commit transaction
        DB::commit();

        // if user created
        if ($user) {
            return redirect(route('admin.users.index'))->with('success', __('messages.admin.feedback.user_created'));
        } else {
            return redirect(route('admin.users.index'))->with('error', __('messages.admin.feedback.user_created'));
        }

    } catch (Throwable $exception) {
        // rollback if error
        DB::rollBack();

        throw $exception;
    }

}

public function update(UserRequest $request, User $user)
{

    try {

        $user->email = $request->email;
        $user->role  = $request->role;

        if ($request->has('password')) {
            $user->password = Hash::make($request->password);
        }

        $user->save();

        // set profile data
        $profile = [
            'first_name' => $request->first_name,
            'last_name'  => $request->last_name,
            'mobile'     => $request->mobile,
            'city'       => $request->city,
            'facebook'   => $request->facebook,
            'twitter'    => $request->twitter,
            'youtube'    => $request->youtube,
            'instagram'  => $request->instagram,
        ];

        // save profile data
        $user->profile()->update($profile);

        return redirect(route('admin.users.index'))->with('success', __('messages.admin.feedback.user_updated'));

    } catch (Throwable $exception) {
        throw $exception;
    }
}

问题:

我有一个用于用户字段和配置文件字段的表单。现在我不确定如何在方法中使用这两个请求类来验证字段。

【问题讨论】:

    标签: laravel laravel-validation


    【解决方案1】:

    我找到了解决方法。在storeupdate 方法中键入ProfileRequest 类并使用它来验证配置文件字段。

    用户控制器

    public function store(UserRequest $request, ProfileRequest $profileRequest)
    {
        // begin transaction
        DB::beginTransaction();
    
        try {
            // create user
            $user = User::create([
                'username' => $request->username,
                'email'    => $request->email,
                'password' => Hash::make($request->password),
                'role'     => $request->role,
            ]);
    
            // set profile data
            $profile = new Profile([
                'first_name' => $profileRequest->first_name,
                'last_name'  => $profileRequest->last_name,
                'mobile'     => $profileRequest->mobile,
                'city'       => $profileRequest->city,
                'facebook'   => $profileRequest->facebook,
                'twitter'    => $profileRequest->twitter,
                'youtube'    => $profileRequest->youtube,
                'instagram'  => $profileRequest->instagram,
            ]);
    
            // save profile data
            $user->profile()->save($profile);
    
            // commit transaction
            DB::commit();
    
            // if user created
            if ($user) {
                return redirect(route('admin.users.index'))->with('success', __('messages.admin.feedback.user_created'));
            } else {
                return redirect(route('admin.users.index'))->with('error', __('messages.admin.feedback.user_created'));
            }
    
        } catch (Throwable $exception) {
            // rollback if error
            DB::rollBack();
    
            throw $exception;
        }
    
    }
    
    public function update(UserRequest $request, ProfileRequest $profileRequest, User $user)
    {
    
        try {
    
            $user->email = $request->email;
            $user->role  = $request->role;
    
            if ($request->has('password')) {
                $user->password = Hash::make($request->password);
            }
    
            $user->save();
    
            // set profile data
            $profile = [
                'first_name' => $profileRequest->first_name,
                'last_name'  => $profileRequest->last_name,
                'mobile'     => $profileRequest->mobile,
                'city'       => $profileRequest->city,
                'facebook'   => $profileRequest->facebook,
                'twitter'    => $profileRequest->twitter,
                'youtube'    => $profileRequest->youtube,
                'instagram'  => $profileRequest->instagram,
            ];
    
            // save profile data
            $user->profile()->update($profile);
    
            return redirect(route('admin.users.index'))->with('success', __('messages.admin.feedback.user_updated'));
    
        } catch (Throwable $exception) {
            throw $exception;
        }
    }
    

    【讨论】:

    • 这太棒了,我从来没有想过尝试将多个请求绑定到一个控制器方法,你为我开辟了一些新的可能性。
    • @Azeame 我很高兴。再次感谢您的帮助。
    【解决方案2】:

    在您的 UserRequest 类中,您可以将它们分配给数组,而不是直接从 switch 语句返回规则。为了我们的目的,我们称之为$rules。然后您应该能够合并您的个人资料中的规则,返回合并后的规则,如下所示:

    $profileRequest = new ProfileRequest(); // you may need to switch this to app()->make(ProfileRequest::class) if you get an error instantiating this
    
    return array_merge($rules, $profileRequest->rules());
    
    

    【讨论】:

    • 收到错误ErrorException array_merge(): Expected parameter 2 to be an array, object given
    • 如果我通过 $profileRequest-&gt;rules() 则得到以下错误 Class 'App\Http\Requests\Validator' not found
    • 那是因为你缺少使用 Illuminate/Validation/Validator;在 ProfileRequest 中,尝试修复它,看看会发生什么
    • 是的,我意识到了这一点。但即便如此之后也无法正常工作。它没有考虑ProfileRequest 的规则。所以最后我找到了一个解决方法。我在该方法中输入了ProfileRequest 的类型提示,并使用它来验证配置文件字段,并且一切正常。谢谢你的帮助。我很感激。
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2017-12-04
    • 2018-05-18
    • 2016-11-26
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多