رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش اعتبار سنجی در لاراول 5
#1
توی این پست یک مثال کاربردی از اعتبار سنجی فرم ها در فریم ورک لاراول رو خواهیم داشت. برای این منظور ابتدا یک فرم رو در فایل view مثلا به نام form.blade.php در پوشه resources/views ایجاد می کنم و کدهای فرم را به این صورت می نویسم :

کد پی‌اچ‌پی:
<ul>
 
   @foreach($errors->all('<li>:message</li>') as $error)
 
       {!! $error !!}
 
   @endforeach
</
ul>
<
form action="{{ url('test') }}" method="post">
 
   <input type="hidden" name="_token" value="{{ csrf_token() }}">
 
   <label for="name">Name</label>
 
   <input type="text" name="name" id="name" value="{{ old('name') }}">
 
 
   <label for="email">Email</label>
 
   <input type="text" name="email" id="email" value="{{ old('email') }}">
 
 
   <label for="age">Age</label>
 
   <input type="text" name="age" id="age" value="{{ old('age') }}">
 
 
   <input type="submit" value="Submit">
</
form


همینطور که مشاهده میکنید اکشن فرم را به مسیر test تعیین کردم. برای فرم هایتان باید حتما یک توکن تعیین کنید که یک فیلد مخفی با نام token_ است و مقدار آن توسط تابع csrf_token ایجاد می شود و برای جلوگیری از حملات csrf به کار می رود. برای هر تکست باکس هم مقدار آن را با تابع کمکی old مقداردهی کردم تا در صورت ریدایرکت بک شدن درخواست مقادیر قبلی فرم حفظ شوند.


خب حالا باید توی فایل routes.php دوتا مسیر تعریف کنیم. مسیر get که فایل فرم را رندر میکند و در مرورگر نمایش می دهد و post هم که مقادیر بعد از سابمیت به آن ارسال می شوند.


کد پی‌اچ‌پی:
Route::get('test', function(){
 
   return view('form');
});
 
Route::post('test' , function(){
 
}); 


من برای طولانی نشدن مثال در همین فایل routes اعتبارسنجی رو انجام میدم اما شما بهتره برای رعایت اصول mvc این اعمال را داخل کنترلرها انجام بدین.


حالا اعتبارسنجی رو به این صورت انجام میدم :


کد پی‌اچ‌پی:
Route::post('test' , function(){
 
   $validator Validator::make(
 
       Request::all(),
 
       [
 
           'name' => 'required',
 
           'email' => 'required|email|unique:users',
 
           'age' => 'numeric',
 
       ]
 
   );
 
 
   if($validator->fails()){
 
       return redirect()->back()->withErrors($validator->errors())->withInput();
 
   }
}); 


همانطور که می بینید از کلاس Validator و متد make استفاده کردم. این متد دوتا پارامتر آرایه ای می گیرد که اولی آرایه ای از مقادیر هست که از فرم ارسال کرده ایم و دومی هم آرایه ای هست که قوانین اعتبارسنجی را برای هر فیلد تعریف می کنیم. چیزی که اینجا جدیده نحوه نوشتن قوانین اعتبار سنجی هست که یک آرایه هست که باید کلید آن نام اون فیلد فرم و مقدار اون قوانین اون فیلد باشد و هر قانون را هم با کاراکتر | از هم جدا میکنیم. required یعنی الزامی بودن فرم و email یعنی یک آدرس ایمیل معتبر باشد یا numeric یعنی مقدار باید عددی باشد و ... . در اینجا از یک قانون به نام unique برای فیلد email قرار دادم که در جدول users بررسی می کند که مقدار ایمیل واردشده در جدول قبلا ثبت نشده باشد. البته باید نام ستون ایمیل در جدول با نام فیلد یکی باشد وگرنه باید نام ستون را هم جلوی قانون اضافه کنیم. 

این قوانین خیلی زیاد هستند که برای اطلاع از آنها و نحوه کارشون به اینجا مراجعه کنید

در نهایت با متد fails بررسی میکنیم اگر اعتبارسنجی دارای خطا بود به صفحه قبل ریدایرکت شود. پیغام های خطا و مقادیر قبلی فرم هم ارسال شوند.


حالا یک روش خیلی ساده تر از قبلی رو بهتون میگم که به جای استفاده از کلاس Validator داخل کنترلر از متد validate خود کنترلر استفاده کنید:


کد پی‌اچ‌پی:
public function store(Request $request)
{
 
   $this->validate($request, [
 
       'title' => 'required|unique|max:255',
 
       'body' => 'required',
 
   ]);
 
 
   //



تو این روش اعتبارسنجی انجام می شود و اگر خطای اعتبارسنجی نداشت که به ادامه کار می پردازد وگرنه خودش اتوماتیک به صفحه قبلی ریدایرکت میکند و پیغام های خطا را هم به آنجا ارسال می کند.


همه برنامه نویسان حرفه ای بدنبال این هستند که همیشه حداقل کد رو بنویسن پس اگر توی کلاس کنترلر مورنظر چندین بار از اعتبارسنجی در اکشن های مختلف می خواهید استفاده کنید باز روش بهتری هست که قوانین رو در یک کلاس request ایجاد کنید. ابتدا با دستور زیر در ترمینال یک کلاس request با نام دلخواه ایجاد کنید :


کد پی‌اچ‌پی:
php artisan make:request StoreBlogPostRequest 


توجه داشته باشید این کلاس حتما باید از کلاس Request ارث برده شود. حالا توی متد rules اون کلاس قوانین رو تعریف کنیم :


کد پی‌اچ‌پی:
public function rules()
{
 
   return [
 
       'title' => 'required|unique|max:255',
 
       'body' => 'required',
 
   ];



کافیه تو هر اکشن کنترلری که می خواهیم اعتبارسنجی انجام شود از این کلاس استفاده کنیم. 


کد پی‌اچ‌پی:
public function store(StoreBlogPostRequest $request)
{
 
   // The incoming request is valid...



درخواست ها ابتدا اعتبارسنجی می شوند در صورتی که بدون خطا باشند وارد اکشن می شوند وگرنه به طور اتوماتیک به صفحه قبلی ریدایرکت و پیغام های خطا هم قابل دسترسی هستند.

نمایش پیغام های خطا در view

کد پی‌اچ‌پی:
echo $errors->first('email');
 
foreach (
$errors->all() as $error)
{
 
   //



در صورتی که فقط خطای فیلد خاصی را بخواهیم نمایش دهیم مانند مثال اول و اگر همه پیغام ها را نمایش دهیم به مانند مثال دوم عمل میکنیم.

همچنین می توانیم پیغام های خطا را در قالب یک تگ HTML نمایش دهیم که من در مثالم به این صورت عمل کردم‌:




کد پی‌اچ‌پی:
<ul>
 
   @foreach($errors->all('<li class="error">:message</li>') as $error)
 
       {!! $error !!}
 
   @endforeach
</
ul


ایجاد یک قانون اعتبار سنجی دلخواه

اگر قانون مورد نظر شما در قوانین موجود لاراول وجود نداشت می توانید با استفاده از متد extend این قانون را ایجاد کنید :


کد پی‌اچ‌پی:
Validator::extend('alpha_spaces', function($attribute$value)
 
       {
 
           return preg_match('/^[\pL\s]+$/u'$value);
 
       }); 


مثلا قانونی که من نیاز داشتم مجاز بودن حروف الفبا و فاصله در یک مقدار بود که در بالا تعریف کردم.



ایجاد پیغام خطای دلخواه برای قوانین اعتبارسنجی


پیغام ها خطا به طور پیش فرض در مسیر resources/lang/en و فایل validation.php تعریف شده اند و به زبان انگلیسی هستند. ما می توانیم یک آرایه تعریف کنیم که کلید آن نام قانون و مقدار آن پیغام خطای مورد نظر شما می باشد و این آرایه را به عنوان پارامتر سوم به متد make بدهیم.


کد پی‌اچ‌پی:
$messages = [
 
   'same'    => 'The :attribute and :other must match.',
 
   'size'    => 'The :attribute must be exactly :size.',
 
   'between' => 'The :attribute must be between :min - :max.',
 
   'in'      => 'The :attribute must be one of the following types: :values',
];
 
$validator Validator::make($input$rules$messages); 


البته راه بهتری پیشنهاد میکنم به جای اینکه در هر اکشن بخواهید این پیغام هارا ست کنید بهتر است داخل مسیر resources/lang یک پوشه به نام fa ایجاد کنیم و همه محتویات پوشه en را داخل آن کپی کنیم و سپس داخل فایل validation.php پیغام های خطای هر قانون را به فارسی و دلخواه خودتان ست کنید. همچنین داخل آرایه attributes داخل همان فایل هم نام فیلدهای فرم که به ظور پیش فرض از خاصیت name هرتکست باکس گرفته می شود را به دلخواه خودتان تغییر دهید.

به مثال زیر توجه کنید :


کد پی‌اچ‌پی:
"required"             => "فیلد :attribute پر کردن آن الزامی است.",
 
 
   'attributes' => [
 
       'name' => 'نام' ,
 
       'email' => 'آدرس ایمیل',
 
       'age' => 'سن',
 
   ], 


برای قانون required یک پیغام دلخواه و نام دلخواهی برای فیلدها در نظر گرفتم.

برای استفاده از این پیغام های دلخواه چون من این پوشه را fa نامگزاری کردم باید داخل فایل app.php در پوشه config آیتم locale را به fa تغییر دهید.


برای اطلاعات بیشتر به اینجا مراجعه کنید


(با تشکر از حامد آریان)
قوانین انجمن لاراولیستا  | شماره تماس :‌09124783045 |‌ تلگرام :‌ 09377869283
پاسخ
#2
(06-02-2015, 06:15 PM)alihossein نوشته:  
کد پی‌اچ‌پی:
Validator::extend('alpha_spaces', function($attribute$value)
 
       {
 
           return preg_match('/^[\pL\s]+$/u'$value);
 
       }); 

ممنون
الان این رو چطور میتونیم رجیستر کنیم؟
پاسخ
#3
(11-06-2015, 09:18 AM)tux-world نوشته:  
(06-02-2015, 06:15 PM)alihossein نوشته:  
کد پی‌اچ‌پی:
Validator::extend('alpha_spaces', function($attribute$value)
 
       {
 
           return preg_match('/^[\pL\s]+$/u'$value);
 
       }); 

ممنون
الان این رو چطور میتونیم رجیستر کنیم؟

روش های مختلفی می تونی انجام بدی راح ترین راه ثبتش داخل متد boot کلاس AppServiceProvider داخل پوشه app/providers هست

اما خود من چون برای هرم فرمم یک کلاس FormRequest ایجاد میکنم به این صورت که در زیر قرار دادم تو متد سازنده rule جدید رو ایجاد میکنم:

کد پی‌اچ‌پی:
namespace App\Http\Requests;

use 
App\Http\Requests\Request;
use 
Validator;

class 
SavePostRequest extends Request
{
    public function 
__construct()
    {
        
Validator::extend('alpha_spaces', function($attribute$value$parameters$validator) {
            return 
preg_match('/^[\pL\s]+$/u'$value);
        });
    }
    
/**
     * 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 [
            
'title' => 'required|alpha_spaces',
            
'body'  => 'required'
        
];
    }

    public function 
messages()
    {
        return [
            
'alpha_spaces' => 'The :attribute must be filling letters and spaces!'
        
];
    }

پاسخ
#4
ممنون. من این قسمت از حرفهاتون رو متوجه نشدم
نقل قول: اما خود من چون برای هرم فرمم یک کلاس FormRequest ایجاد میکنم به این صورت که در زیر قرار دادم تو متد سازنده rule جدید رو ایجاد میکنم:
پاسخ
#5
با سلام و خسته نباشید مطلب خیلی مفید و کاربردی و بر خلاف جاهای دیگه که فقط رفتن سایت لاراول و ترجمه کردن و با ابهام مطلب گذاشتن شما خیلی عالی توضیح دادین . خدا خیرت بده .ممنون
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش روتینگ routing در لاراول 5 alihossein 2 1,121 11-12-2016, 04:37 AM
آخرین ارسال: حمید رﺽا کمالی
  آموزش کار با دیتابیس در لاراول 5 alihossein 6 1,545 10-27-2016, 01:01 PM
آخرین ارسال: sempaisaleh
  اعتبار سنجی مدیر و کاربر هنگام لاگین کردن ilbeygi 0 83 08-22-2016, 02:11 PM
آخرین ارسال: ilbeygi
  آموزش Migration در لاراول 5 alihossein 9 1,152 08-15-2016, 04:17 PM
آخرین ارسال: Naser.SherafatiNia
  آموزش فارسی لاراول ۵ alihossein 4 2,854 07-22-2016, 04:16 PM
آخرین ارسال: elham_malekmohamadi
  # سوال : آموزش ساخت ربات تلگرام با پکیج irazasyed/telegram-bot-sdk Bvk.Programmer 0 230 04-25-2016, 04:54 PM
آخرین ارسال: Bvk.Programmer
  درخواست آموزش کار با پکیج intervention/image Bvk.Programmer 6 491 04-18-2016, 05:52 PM
آخرین ارسال: hamo
Rainbow آموزش : پکیچ کاربردی ajax-blade Bvk.Programmer 0 200 02-15-2016, 06:04 PM
آخرین ارسال: Bvk.Programmer
  آموزش Session ها در لاراول 5 alihossein 1 661 01-29-2016, 12:33 PM
آخرین ارسال: SajadDP
  آموزش کنترلر ها در لاراول 5 alihossein 3 964 01-07-2016, 02:28 PM
آخرین ارسال: Bvk.Programmer

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

درباره انجمن فریم ورک لاراول

انجمن لاراولیستا به عشق توسعه دهنده ها و علاقمندان به این فریم ورک محبوب ایجاد شده و امیدواریم با نظرات خوبتون ما رو در بهبود کار یاری کنید. در ضمن خیلی هم خوشحال میشیم شما هم در توسعه این انجمن سهمی داشته باشید.