validation در لاراول
Laravel چندین روش مختلف برای تأیید اعتبار داده های ورودی برنامه شما ارائه می دهد. به طور پیش فرض ، کلاس کنترلر پایه لاراول از یک صفت ValidatesRequests استفاده می کند که روشی مناسب برای اعتبارسنجی درخواستهای HTTP ورودی با انواع قوانین اعتبار سنجی قدرتمند ارائه می دهد.
تعریف مسیرها:
ابتدا فرض کنیم مسیرهای زیر را در پرونده خود تعریف کرده ایم:
Route::get('post/create', 'PostController@create');
Route::post('post', 'PostController@store');
مسیر GET فرم ایجاد وبلاگ جدید را برای کاربر نمایش می دهد ، در حالی که مسیر POST پست جدید وبلاگ را در پایگاه داده ذخیره می کند.
ایجاد کنترلر
بعد ، بیایید نگاهی بیندازیم به یک کنترلر ساده که این مسیرها را کنترل می کند. اکنون روش store را خالی می گذاریم:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*
* @return Response
*/
public function create()
{
return view('post.create');
}
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// Validate and store the blog post...
}
}
نوشتن منطق اعتبار سنجی
اکنون ما آماده هستیم تا روش STORE خود را با این منطق برای اعتبارسنجی پست وبلاگ جدید پر کنیم. برای این کار از روشی معتبر تهیه شده توسط شی Illuminate \ Http \ Request استفاده خواهیم کرد. اگر قوانین اعتبارسنجی تصویب شوند ، کد شما اجرای خود را به صورت عادی ادامه می دهد. اما اگر اعتبار سنجی انجام نشود ، یک استثناء انداخته می شود و پاسخ خطایی مناسب به طور خودکار به کاربر ارسال می شود. در صورت درخواست سنتی HTTP ، یک پاسخ تغییر مسیر ایجاد می شود ، در حالی که یک پاسخ JSON برای درخواست های AJAX ارسال می شود.
برای درک بهتر روش VALIDATE ، بیایید دوباره به روش STORE برویم:
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
}
همانطور که مشاهده می کنید ، قوانین اعتبارسنجی مورد نظر را به روش VALIDATE منتقل می کنیم. باز هم ، اگر اعتبار سنجی انجام نشود ، پاسخ مناسب به طور خودکار ایجاد می شود. اگر اعتبار سنجی بگذرد ، کنترلر ما به طور معمول اجرای خود را ادامه می دهد.
از طرف دیگر ، قوانین اعتبارسنجی ممکن است به جای یک تک به عنوان آرایه ای از قوانین مشخص شوند | رشته نامحدود:
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
اگر مایل هستید ERROR BAG را که پیام های خطا در آن قرار داده شده است ، مشخص کنید ، می توانید از روش validateWithBag استفاده کنید:
$request->validateWithBag('blog', [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
متوقف کردن اولین عدم موفقیت اعتبارسنجی:
بعضی اوقات ممکن است بخواهید بعد از اولین خرابی اعتبار ، اجرای قوانین اعتبارسنجی را روی یک ویژگی متوقف کنید. برای این کار ، قانون BAIL را به این ویژگی اختصاص دهید:
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
در این مثال ، اگر قانون UNIQUE روی ویژگی TITLE خراب شود ، قانون MAX بررسی نمی شود. قوانین به ترتیبی که تعیین شده اند معتبر خواهند بود.
یادداشت در مورد ویژگی های تو در تو
اگر درخواست HTTP شما حاوی پارامترهای "تو در تو" است ، می توانید آنها را در قوانین اعتبار خود با استفاده از نحو "نقطه" مشخص کنید:
$request->validate([
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
خطاهای اعتبار سنجی
بنابراین ، اگر پارامترهای درخواست ورودی ، قوانین اعتبارسنجی داده شده را تصویب نکنند ، چه می شود؟ همانطور که قبلاً نیز گفته شد ، Laravel به طور خودکار کاربر را به مکان قبلی خود هدایت می کند. علاوه بر این ، تمام خطاهای اعتبارسنجی به طور خودکار به جلسه چشمک می زنند.
باز هم توجه کنید که ما در مسیر GET خود مجبور نبودیم پیغامهای خطا را به طور صریح به نمایش پیوند دهیم. این امر به این دلیل است که Laravel خطاهای موجود در داده های جلسه را بررسی می کند و در صورت موجود بودن آنها را به طور خودکار به نمایش متصل می کند. متغیر $ ERROR نمونه ای از Illuminate \ Support \ MessageBag خواهد بود.
متغیر ERROR$ توسط واسطه بین المللی Illuminate \ View \ Middleware \ ShareErrorsFromSession ، که توسط گروه وب MIDDLEWARE تهیه شده است ، به نمای محدود می شود. هنگامی که این میان افزار اعمال می شود ، یک متغیر ERROR$ همیشه در دیدگاه های شما موجود می باشد ، به شما امکان می دهد فرض کنید متغیر ERROR$ به راحتی همیشه تعریف شده است و می توانید با خیال راحت از آن استفاده کنید.
بنابراین ، در مثال ما ، کاربر در صورت عدم موفقیت اعتبار به کاربر ، به روش ایجاد کنترلر ما هدایت می شود و به ما اجازه می دهد تا پیام های خطا را در نمای نمایش دهیم:
<!-- /resources/views/post/create.blade.php -->
<h1>Create Post</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Create Post Form -->
یادداشت در زمینه های اختیاری
به طور پیش فرض ، Laravel شامل واسط TrimStrings و ConvertEmptyStringsToNull در پشته جهانی برنامه جهانی برنامه شما است. این وسایل واسط طبق برنامه App \ Http \ Kernel در پشته ذکر شده اند. به همین دلیل ، اگر نمی خواهید اعتبارگر مقادیر NULL را نامعتبر در نظر بگیرد ، اغلب باید زمینه های درخواست "اختیاری" خود را به عنوان NULLABLE علامت گذاری کنید. مثلا:
$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
در این مثال ، ما مشخص می کنیم که قسمت bot_at ممکن است NULL یا یک تاریخ معتبر باشد. اگر اصلاح کننده NULLABLE به تعریف قانون اضافه نشود ، اعتبار دهنده NULL را یک تاریخ نامعتبر می داند.
درخواستها و اعتبار سنجی AJAX:
در این مثال ، ما برای ارسال داده به برنامه از یک فرم سنتی استفاده کردیم. با این حال ، بسیاری از برنامه ها از درخواست های AJAX استفاده می کنند. هنگام استفاده از روش VALIDATE در طی درخواست AJAX ، Laravel پاسخی برای تغییر مسیر ایجاد نمی کند. در عوض ، Laravel یک پاسخ JSON تولید می کند که حاوی همه خطاهای اعتبارسنجی است. این پاسخ JSON با کد وضعیت 422 HTTP ارسال می شود.
اعتبار درخواست فرم
ایجاد درخواست های فرم
برای سناریوهای اعتبار سنجی پیچیده تری ، ممکن است بخواهید "درخواست فرم" ایجاد کنید. درخواست فرم ها کلاس های درخواست سفارشی هستند که حاوی منطق اعتبار سنجی هستند. برای ایجاد یک کلاس درخواست فرم ، از دستور artisan CLI استفاده کنید :make:request
php artisan make:request StoreBlogPost
کلاس تولید شده در فهرست قرار می گیرد . اگر این فهرست وجود نداشته باشد ، هنگام اجرای دستور ، ایجاد می شود . بیایید چند قانون اعتبار سنجی را به روش اضافه کنیم:app/Http/Requests
make:request
rules
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
شما می توانید وابستگی های مورد نیاز خود را در
rules
امضای روش تایپ کنید . آنها بطور خودکار از طریق ظرف سرویس Laravel برطرف می شوند .
بنابراین ، قوانین اعتبار سنجی چگونه ارزیابی می شوند؟ تنها کاری که باید انجام دهید اینست که درخواست را به روش کنترل خود تایپ کنید. قبل از فراخوانی روش کنترل ، درخواست فرم ورودی تأیید می شود ، به این معنی که نیازی به کنترل و کنترل خود با هرگونه منطق اعتبار ندارید:
/**
* Store the incoming blog post.
*
* @param StoreBlogPost $request
* @return Response
*/
public function store(StoreBlogPost $request)
{
// The incoming request is valid...
// Retrieve the validated input data...
$validated = $request->validated();
}
در صورت عدم موفقیت اعتبار ، پاسخی برای تغییر مسیر ایجاد می شود تا کاربر به محل قبلی خود برگردد. خطاها همچنین به جلسه چشمک می زنند ، بنابراین برای نمایش در دسترس هستند. اگر درخواست یک درخواست AJAX بود ، یک پاسخ HTTP با کد وضعیت 422 از جمله نمایندگی JSON از خطاهای اعتبار سنجی به کاربر بازگردانده می شود.
افزودن قلاب پس از شکل دادن به درخواست ها
اگر می خواهید قلاب "بعد" را به درخواست فرم اضافه کنید ، می توانید از این withValidator
روش استفاده کنید. این روش اعتبار سنجی کاملاً ساخته شده را دریافت می کند و به شما امکان می دهد قبل از ارزیابی قوانین اعتبارسنجی ، هرکدام از روشهای آن را فراخوانی کنید:
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
}
درخواست فرم های مجاز
کلاس درخواست فرم همچنین شامل authorize
روشی است. در این روش ، شما می توانید بررسی کنید که آیا کاربر معتبر در واقع صلاحیت به روزرسانی یک منبع داده شده را دارد یا خیر. به عنوان مثال ، شما ممکن است تعیین کنید که آیا کاربر در واقع صاحب نظر وبلاگی است که در تلاش است تا آن را به روز کند:
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}
از آنجا که کلیه درخواست های فرم ، کلاس درخواست اصلی Laravel را گسترش می دهد ، ما ممکن است از این user
روش برای دسترسی به کاربر معتبر فعلی استفاده کنیم. همچنین route
در مثال بالا تماس با روش را یادداشت کنید . این روش به شما امکان دسترسی به پارامترهای URI تعریف شده در مسیری که گفته می شود ، مانند پارامتر موجود در مثال زیر می دهد:{comment}
Route::post('comment/{comment}');
اگر این authorize
روش بازگردد false
، یک پاسخ HTTP با کد وضعیت 403 بطور خودکار برمی گردد و روش کنترل کننده شما اجرا نمی شود.
اگر می خواهید در قسمت دیگری از برنامه خود منطق مجوز داشته باشید ، true
از authorize
روش برگردید :
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
شما می توانید وابستگی های مورد نیاز خود را در
authorize
امضای روش تایپ کنید . آنها بطور خودکار از طریق ظرف سرویس Laravel برطرف می شوند .
شخصی سازی پیام های خطا
شما می توانید پیام های خطا استفاده شده توسط درخواست فرم را با غلبه بر این messages
روش سفارشی کنید . این روش باید مجموعه ای از جفت های ویژگی / قانون و پیام های خطای مربوطه را برگرداند:
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
شخصی سازی ویژگی های اعتبار سنجی
اگر دوست دارید :attribute
قسمتی از پیام اعتبارسنجی شما با نام ویژگی سفارشی جایگزین شود ، می توانید با غلبه بر attributes
روش ، نامهای دلخواه را مشخص کنید . این روش باید مجموعه ای از جفت های ویژگی / نام را برگرداند:
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [
'email' => 'email address',
];
}
ورودی را برای اعتبار سنجی آماده کنید
اگر لازم است قبل از اعمال قوانین اعتبارسنجی خود ، داده های مربوط به درخواست را از بین ببرید ، می توانید از این prepareForValidation
روش استفاده کنید:
use Illuminate\Support\Str;
/**
* Prepare the data for validation.
*
* @return void
*/
protected function prepareForValidation()
{
$this->merge([
'slug' => Str::slug($this->slug),
]);
}
ایجاد اعتبار سنجی دستی
اگر نمی خواهید از validate
روش درخواست استفاده کنید ، می توانید یک نمونه معتبر را به صورت دستی با استفاده از Validator
نما ایجاد کنید . make
روش در نما تولید یک نمونه جدید تأیید:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class PostController extends Controller
{
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
// Store the blog post...
}
}
اولین آرگومان منتقل شده به make
روش ، داده های مورد تأیید است. استدلال دوم قوانین اعتبار سنجی است که باید برای داده ها اعمال شود.
پس از بررسی عدم اعتبار سنجی درخواست ، می توانید از این withErrors
روش برای فلش کردن پیام های خطا به جلسه استفاده کنید. هنگام استفاده از این روش ، $errors
متغیر پس از تغییر مسیر به طور خودکار با نظرات شما به اشتراک گذاشته می شود و به شما امکان می دهد تا به راحتی آنها را به کاربر نمایش دهید. این withErrors
روش یک اعتبار سنج ، a MessageBag
یا یک PHP را می پذیرد array
.
تغییر مسیر خودکار
اگر مایل هستید یک نمونه اعتبار سنج را بصورت دستی ایجاد کنید اما هنوز از هدایت خودکار ارائه شده با validate
روش درخواست استفاده می کنید ، می توانید این validate
روش را به عنوان یک اعتبار سنج موجود فراخوانی کنید. در صورت عدم موفقیت اعتبار ، کاربر به طور خودکار هدایت می شود یا در صورت درخواست AJAX ، پاسخ JSON برمی گردد:
Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
])->validate();
کیف های خطا نامگذاری شده است
اگر چندین صفحه در یک صفحه وجود دارید ، ممکن است بخواهید MessageBag
خطاها را نامگذاری کنید ، به شما امکان می دهد پیام های خطا را برای یک فرم خاص بازیابی کنید. یک نام به عنوان استدلال دوم به این موارد منتقل کنید withErrors
:
return redirect('register')
->withErrors($validator, 'login');
سپس می توانید به MessageBag
عنوان مشخص شده از $errors
متغیر دسترسی پیدا کنید :
{{ $errors->login->first('email') }}
بعد از هوک اعتبار سنجی
اعتبار سنج همچنین به شما امکان می دهد تا پس از اتمام اعتبار ، تماسهای متصل را اجرا کنید. این به شما امکان می دهد تا اعتبارسنجی بیشتری را به راحتی انجام داده و حتی پیام های خطایی بیشتری را به مجموعه پیام ها اضافه کنید. برای شروع ، از after
روش به عنوان مثال اعتبار سنج استفاده کنید:
$validator = Validator::make(...);
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
if ($validator->fails()) {
//
}
کار با پیام های خطا
پس از فراخوانی این errors
روش به طور Validator
مثال ، نمونه ای دریافت می کنید که دارای روش های متنوعی برای کار با پیام های خطا است. متغیر است که به طور خودکار در دسترس همه دیدگاه ها ساخته شده است یک نمونه از کلاس.Illuminate\Support\MessageBag
$errors
MessageBag
بازیابی اولین پیام خطا برای یک زمینه
برای بازیابی اولین پیام خطا برای یک قسمت خاص ، از first
روش استفاده کنید:
$errors = $validator->errors();
echo $errors->first('email');
بازیابی تمام پیام های خطا برای یک زمینه
اگر لازم است مجموعه ای از همه پیام ها را برای یک قسمت خاص بازیابی کنید ، از این get
روش استفاده کنید:
foreach ($errors->get('email') as $message) {
//
}
اگر شما به اعتبار یک میدان فرم آرایه، شما ممکن است تمام پیام برای هر یک از عناصر آرایه با استفاده از بازیابی *
شخصیت:
foreach ($errors->get('attachments.*') as $message) {
//
}
بازیابی تمام پیام های خطا برای همه زمینه ها
برای بازیابی آرایه ای از همه پیام ها برای همه زمینه ها ، از all
روش استفاده کنید:
foreach ($errors->all() as $message) {
//
}
تعیین اگر پیام ها برای یک زمینه وجود دارند
این has
روش ممکن است برای تعیین وجود پیام های خطایی برای یک قسمت خاص استفاده شود:
if ($errors->has('email')) {
//
}
پیام های خطای سفارشی
در صورت لزوم ، می توانید به جای پیش فرض از پیام های خطای سفارشی برای اعتبار سنجی استفاده کنید. روش های مختلفی برای تعیین پیام های سفارشی وجود دارد. ابتدا ، شما می توانید پیام های سفارشی را به عنوان سومین آرگومان به روش منتقل کنید:Validator::make
$messages = [
'required' => 'The :attribute field is required.',
];
$validator = Validator::make($input, $rules, $messages);
در این مثال ، جای :attribute
نگهدارنده با نام واقعی رشته تحت اعتبار جایگزین می شود. همچنین می توانید از متغیرهایی دیگر در پیام های اعتبار سنجی استفاده کنید. مثلا:
$messages = [
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute value :input is not between :min - :max.',
'in' => 'The :attribute must be one of the following types: :values',
];
تعیین پیام سفارشی برای یک ویژگی خاص
بعضی اوقات ممکن است بخواهید یک پیام خطای سفارشی را فقط برای یک قسمت خاص مشخص کنید. شما ممکن است این کار را با استفاده از نماد "نقطه" انجام دهید. ابتدا نام ویژگی را مشخص کنید ، و به دنبال آن این قاعده:
$messages = [
'email.required' => 'We need to know your e-mail address!',
];
تعیین پیام های سفارشی در پرونده های زبان
در بیشتر موارد ، احتمالاً به جای انتقال مستقیم آنها به آن ، پیامهای سفارشی خود را در یک فایل زبانی مشخص خواهید کرد Validator
. برای این کار ، پیام های خود را برای custom
آرایه در پرونده زبان اضافه کنید.resources/lang/xx/validation.php
'custom' => [
'email' => [
'required' => 'We need to know your e-mail address!',
],
],
مشخص کردن ویژگی های سفارشی در پرونده های زبان
اگر دوست دارید :attribute
بخشی از پیام اعتبارسنجی شما با نام ویژگی سفارشی جایگزین شود ، می توانید نام دلخواه را در attributes
مجموعه فایل زبان خود تعیین کنید:resources/lang/xx/validation.php
'attributes' => [
'email' => 'email address',
],
تعیین مقادیر سفارشی در پرونده های زبان
بعضی اوقات ممکن است لازم باشد :value
بخشی از پیام اعتبارسنجی شما با یک نمایش دلخواه از مقدار جایگزین شود. به عنوان مثال ، این قانون زیر را در نظر بگیرید که مشخص می کند در صورت payment_type
داشتن مقدار کارت اعتباری لازم است cc
:
$request->validate([
'credit_card_number' => 'required_if:payment_type,cc'
]);
در صورت عدم موفقیت این قانون ، پیام خطای زیر را تولید می کند:
The credit card number field is required when payment type is cc.
به جای نمایش cc
به عنوان مقدار نوع پرداخت ، می توانید validation
با تعیین یک values
آرایه ، یک مقدار ارزش دلخواه را در پرونده زبان خود تعیین کنید:
'values' => [
'payment_type' => [
'cc' => 'credit card'
],
],
در صورت عدم موفقیت اعتبار ، پیام زیر را تولید می کند:
The credit card number field is required when payment type is credit card.
قوانین اعتبار سنجی موجود
در زیر لیستی از کلیه قوانین اعتبار سنجی موجود و عملکرد آنها آورده شده است:
- ۹۸/۱۱/۲۰