>  기사  >  PHP 프레임워크  >  Laravel에서 요청 검증을 처리하는 현명한 방법

Laravel에서 요청 검증을 처리하는 현명한 방법

藏色散人
藏色散人앞으로
2019-09-20 09:41:003015검색

Laravel에서 요청 검증을 처리하는 현명한 방법

Laravel은 Web Craftsman을 위한 PHP 프레임워크입니다. 이는 강력한 애플리케이션과 API를 구축하는 데 도움이 됩니다. 많은 분들이 아시다시피 Laravel에서 요청을 검증하는 방법은 다양합니다. 요청 유효성 검사를 처리하는 것은 모든 애플리케이션에서 매우 중요한 부분입니다. Laravel에는 이 문제를 매우 잘 처리하는 몇 가지 훌륭한 기능이 있습니다.

시작하기

우리 대부분은 컨트롤러에서 유효성 검사기를 사용하는 데 익숙합니다. 이는 들어오는 요청의 유효성 검사를 처리하는 가장 일반적인 방법입니다.

다음은 유효성 검사기의 모습입니다. UserController

<?php
namespace App\Http\Controllers\API\v1\Users;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Entities\Models\User;
class UserController extends Controller
{
    public function store(Request $request)
    {
        // validate incoming request
        $validator = Validator::make($request->all(), [
           &#39;email&#39; => &#39;required|email|unique:users&#39;,
           &#39;name&#39; => &#39;required|string|max:50&#39;,
           &#39;password&#39; => &#39;required&#39;
       ]);
       if ($validator->fails()) {
            Session::flash(&#39;error&#39;, $validator->messages()->first());
            return redirect()->back()->withInput();
       }
       // finally store our user
    }
}

컨트롤러에서 유효성 검사하기

컨트롤러에서 들어오는 요청을 유효성 검사하는 데 문제는 없지만 이것이 최선의 방법은 아닙니다. 컨트롤러가 혼란스러워 보일 것입니다. 제 생각에는 이것은 나쁜 습관입니다. 컨트롤러는 경로에서 하나의 처리 요청만 처리하고 적절한 응답을 반환해야 합니다.

컨트롤러에 유효성 검사 논리를 작성하면 단일 책임 원칙이 깨집니다. 우리 모두는 요구 사항이 시간이 지남에 따라 변하고 요구 사항이 변경될 때마다 수업에 대한 책임도 변한다는 것을 알고 있습니다. 따라서 단일 클래스에 많은 책임이 있으면 관리가 매우 어려워집니다.

Laravel에는 유효성 검사 논리가 포함된 별도의 요청 클래스인 양식 요청이 있습니다. Artisan 명령을 사용하여 만들 수 있습니다.

php artisan make: request UserStoreRequest

이것은 새로운 요청 클래스 appHttpRequestUserRequest

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            &#39;email&#39; => &#39;required|email|unique:users&#39;,
            &#39;name&#39; => &#39;required|string|max:50&#39;,
            &#39;password&#39; => &#39;required&#39;
        ];
    }
     /**
     * Custom message for validation
     *
     * @return array
     */
    public function messages()
    {
        return [
            &#39;email.required&#39; => &#39;Email is required!&#39;,
            &#39;name.required&#39; => &#39;Name is required!&#39;,
            &#39;password.required&#39; => &#39;Password is required!&#39;
        ];
    }
}

Laravel 양식 요청 클래스에는 두 가지 기본 메소드 auth()와 rule()이 있습니다. 현재 사용자의 요청 허용 여부에 관계없이 auth() 메서드에서 모든 인증 논리를 수행할 수 있습니다. rule() 메소드에서 모든 유효성 검사 규칙을 작성할 수 있습니다. 자신만의 유효성 검사 메시지 배열을 전달하는 message() 메서드도 있습니다.

이제 UserStoreRequest를 사용하도록 UserController를 변경하세요. 요청 클래스에 대한 프롬프트를 입력하면 컨트롤러 기능을 호출하기 전에 자동으로 구문 분석하고 유효성을 검사합니다.

<?php
namespace App\Http\Controllers\API\v1\Users;
use App\Http\Controllers\Controller;
use App\Http\Requests\UserStoreRequest;
class UserController extends Controller
{
    public function store(UserStoreRequest $request)
    {
        // Will return only validated data
        $validated = $request->validated();
    }
}

이제 컨트롤러가 슬림해지고 유지 관리가 쉬워졌습니다. 이제 컨트롤러는 유효성 검사 논리에 대해 걱정할 필요가 없습니다. 우리는 검증을 처리하고 컨트롤러가 그곳에서 작동하도록 하는 단 하나의 책임을 가진 자체 검증 클래스를 가지고 있습니다.

인증에 실패하면 사용자를 이전 위치로 리디렉션하고 오류를 표시합니다. 요청 유형에 따라 세션에서 오류 메시지가 깜박입니다. 요청이 AJAX인 경우 422 상태 코드 및 JSON 형식 오류와 함께 응답이 반환됩니다.

Return

입력을 삭제하여 애플리케이션과 사용자를 안전하게 보호하세요. 애플리케이션에서 클리너를 사용하면 데이터의 형식이 항상 올바르고 일관되게 유지됩니다. 많은 경우 어리석은 형식 오류로 인해 유효성 검사가 실패합니다.

사용자가 입력한 휴대폰 번호는 +99-9999-999999 또는 +99-(9999)-(999999)입니다. 이는 매우 흔히 발생하는 실수이므로 사용자에게 동일한 세부정보를 다시 입력하도록 강요할 수는 없습니다.

다른 예로는 사용자가 Foo@Bar.COM 또는 FOO@Bar.com으로 이메일을 입력하는 경우가 있습니다. 또는 FOO **bAR 또는 foo baR**과 같은 이름과 성을 입력하세요.

Sanitizer에는 데이터를 유효성 검사기에 공급하기 전에 일반적인 형식으로 데이터를 변환하고 필터링하는 방법이 포함되어 있습니다.

저는 많은 필터가 포함된 Waavi/Sanitizer 패키지를 사용하고 있습니다.

Waavi / 데이터 정리

양식 요청을 위한 추상 클래스 BaseFormRequest를 만들고 여기에서 SanitizesInput 특성을 사용해 보겠습니다.

<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Waavi\Sanitizer\Laravel\SanitizesInput;
abstract class BaseFormRequest extends FormRequest
{
    use ApiResponse, SanitizesInput;
    /**
     * For more sanitizer rule check https://github.com/Waavi/Sanitizer
     */
    public function validateResolved()
    {
        {
            $this->sanitize();
            parent::validateResolved();
        }
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    abstract public function rules();
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    abstract public function authorize();
}

이제 아래 UserStoreRequest를 작성할 수 있습니다. 기본 클래스에서 양식 요청을 확장하면 모든 요청 클래스에 특성을 포함할 필요가 없습니다.

<?php
namespace App\Http\Requests;
class UserStoreRequest extends BaseFormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            &#39;email&#39; => &#39;required|email|unique:users&#39;,
            &#39;name&#39; => &#39;required|string|max:50&#39;,
            &#39;password&#39; => &#39;required&#39;
        ];
    }
    public function messages()
    {
        return [
            &#39;email.required&#39; => &#39;Email is required!&#39;,
            &#39;name.required&#39; => &#39;Name is required!&#39;,
            &#39;password.required&#39; => &#39;Password is required!&#39;
        ];
    }
    /**
     *  Filters to be applied to the input.
     *
     * @return array
     */
    public function filters()
    {
        return [
            &#39;email&#39; => &#39;trim|lowercase&#39;,
            &#39;name&#39; => &#39;trim|capitalize|escape&#39;
        ];
    }
}

SanitizesInputtrait는 요청 데이터를 유효성 검사기에 제공하기 전에 형식을 지정하는 필터() 메서드를 제공합니다. 필터() 메서드는 유효한 필터 배열을 반환합니다. 여기서는 이름을 대문자로 변환하고 HTML 태그를 이스케이프하는 것과 동일한 방식으로 사용자 이메일을 소문자로 변환하고 다듬습니다.

여기에서 사용 가능한 필터에 대해 자세히 알아볼 수 있습니다.

결론

우선 모든 사람을 위한 별도의 요청 수업을 만들 필요는 없을 것 같습니다. 하지만 모든 검증 로직을 동일한 컨트롤러에 넣는다고 상상해보세요. 그것은 나쁜 악몽과도 같습니다. 코드 관리에 있어서 다른 사람이 코드를 관리해야 한다면 얼마나 더 나쁜가요? .

읽어주셔서 감사합니다.

이에 대한 귀하의 생각을 듣고 싶습니다. 질문이나 제안 사항이 있으면 아래에 의견을 남겨주세요.

좋은 하루 보내세요.

더 많은 Laravel 관련 기술 기사를 보려면 Laravel Framework Getting Started Tutorial 칼럼을 방문하여 알아보세요!

위 내용은 Laravel에서 요청 검증을 처리하는 현명한 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제