اكتشف إطار PHP Laravel


الدرس: التحقق من صحة Validation


الصفحة السابقة
رأينا في الفصل السابق سيناريو تنفيذ نموذج. نحن لم نفرض أي قيود على القيم المنقولة. في التطبيق الحقيقي ، من الضروري دائمًا التحقق من أن هذه القيم تتوافق مع ما هو متوقع. على سبيل المثال ، يجب أن يحتوي الاسم على أحرف أبجدية فقط ويبلغ طوله الأقصى ، ويجب أن يتوافق عنوان البريد الإلكتروني مع تنسيق معين.
لذلك من الضروري إعداد قواعد التحقق من الصحة. بشكل عام ، نقوم بإجراء عملية تحقق أولية من جانب العميل لتجنب الذهاب و الرجوع مع الخادم. ولكن مهما كانت أهمية هذا التحقق من جانب العميل ، فهو لا يعفي من التحقق من الصحة من جانب الخادم.
يجب ألا تثق أبدًا بالبيانات التي تصل إلى الخادم.
في مثال هذا الفصل ، لن أقدم إثباتًا من جانب العميل ، فمن ناحية ليس غرضي ، من ناحية أخرى ، فإنه يخفي التحقق من الصحة من جانب الخادم للاختبارات.

السيناريو والطرق


إليكم السيناريو الذي اقترحه لهذا الفصل:
framework Laravel MVC
الاتصال السيناريو
  1. يطلب العميل نموذج الاتصال ،
  2. وحدة تحكم يولد النموذج ،
  3. وحدة تحكم يرسل النموذج ،
  4. يملأ العميل النموذج ويرسله ،
  5. تختبر وحدة التحكم صحة المعلومات وهناك احتمالان:
    • في حالة الفشل ، يتم إرجاع النموذج إلى العميل لإعلامه بالأخطاء والاحتفاظ بالإدخالات الصحيحة الخاصة بهم
    • إذا نجحت ، نرسل رسالة تأكيد إلى العميل وبريد إلكتروني إلى المسؤول.
الطرق
لذلك سنحتاج إلى طريقين:

<?php
Route::get('contact', 'ContactController@getForm');
Route::post('contact', 'ContactController@postForm');
سيكون لدينا رابط واحد فقط (مع فعل "get" لطلب النموذج و فعل "post" لتقديمه) : http://monsite.fr/contact

واجهات العرضViews


القالب template
بالنسبة لهذا الفصل ، سوف أقوم بإنشاء قالب واقعي باستخدام Bootstrap لتخفيف الكود. إليك كود هذا القالب ( resources/views/template.blade.php) :

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Mon joli site</title>
        {!! Html::style('https://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css') !!}
        {!! Html::style('https://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css') !!}
        <!--[if lt IE 9]>
        { { Html::style('https://oss.maxcdn.com/libs/html5shiv/3.7.2/html5shiv.js') }}
        { { Html::style('https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js') }}
        <![endif]-->
        <style> textarea { resize: none; } </style>
    </head>
    <body>
    @yield('contenu')
    </body>
</html>
أذكرك أنه في Blade هناك تركيبتان: تسمح الدعامة المزدوجة({ { }} ) بتأمين الكود من خلال الهروب من الحروف الخاصة أثناء استخدام {!! !!} لا ينفذ أي علاج وبالتالي يجب استخدامه بحذر.
لإنشاء ارتباطات إلى مكتبات CSS ، استخدمت الفصل Html  مع طريقته style . هناك عدد من الأساليب العملية في هذه الفئة التي سنكتشفها تدريجياً.
لقد خططت للموقع  @yield  المسمى "contenu" لاستلام صفحات الموقع ، على سبيل المثال ، لن يكون لدينا سوى صفحة الاتصال وصفحة التأكيد. 
واجهة عرض الاتصال
سوف تحتوي طريقة عرض جهة الاتصال بشكل أساسي على نموذج ( resources/views/contact.blade.php) :

@extends('template')

@section('contenu')
    <br>
    <div class="col-sm-offset-3 col-sm-6">
        <div class="panel panel-info">
            <div class="panel-heading">Contactez-moi</div>
            <div class="panel-body"> 
                {!! Form::open(['url' => 'contact']) !!}
                    <div class="form-group {!! $errors->has('nom') ? 'has-error' : '' !!}">
                        {!! Form::text('nom', null, ['class' => 'form-control', 'placeholder' => 'Votre nom']) !!}
                        {!! $errors->first('nom', '<small class="help-block">:message</small>') !!}
                    </div>
                    <div class="form-group {!! $errors->has('email') ? 'has-error' : '' !!}">
                        {!! Form::email('email', null, ['class' => 'form-control', 'placeholder' => 'Votre email']) !!}
                        {!! $errors->first('email', '<small class="help-block">:message</small>') !!}
                    </div>
                    <div class="form-group {!! $errors->has('texte') ? 'has-error' : '' !!}">
                        {!! Form::textarea ('texte', null, ['class' => 'form-control', 'placeholder' => 'Votre message']) !!}
                        {!! $errors->first('texte', '<small class="help-block">:message</small>') !!}
                    </div>
                    {!! Form::submit('Envoyer !', ['class' => 'btn btn-info pull-right']) !!}
                {!! Form::close() !!}
            </div>
        </div>
    </div>
@endsection
تعمل طريقة العرض هذه على توسيع القالب الموضح أعلاه وملء قسم ""contenu . لا أعلق على التنسيق الخاص بـ Bootstrap . يتم إنشاء النموذج مع الفئة Form  الذي رأيناها بالفعل في الفصل السابق.
بنية أساليب إنشاء عناصر تحكم النموذج هي دائماً نفسها. خذ على سبيل المثال البريد الإلكتروني:

<?php
{!! Form::email('email', null, ['class' => 'form-control', 'placeholder' => 'Votre email']) !!}
نريد عنصر نموذج ( Form) من النوع "البريد الإلكتروني" مع الاسم "email" مع قيمة فارغة ومع تحديد قيمة السمات "class" و "placeholder".
من الواضح أن زر الإرسال ليس له قيمة وبالتالي لدينا مُدخل ناقص.
إذا تم استلام النموذج مع أخطاء ، يتم تلقي متغير $errors  يحتوي على جدول يحتوي على أسماء عناصر التحكم كمفاتيح والنصوص التي تحدد الأخطاء كقيم.
 يتم إنشاء المتغير $errors بشكل منهجي لجميع واجهات العرض.
هذا هو سبب اختبار وجود خطأ لكل عنصر تحكم عن طريق ضبط النمط وعرض نص الخطأ إذا لزم الأمر مع الطريقة الأولى :

{!! $errors->first('nom', '<small class="help-block">:message</small>') !!}
إذا لم يكن هناك أي خطأ ، فلن يُرجع أي شيء ، وبالتالي لا يتم عرض أي شيء ، وإلا فإننا نستعيد الأول ( first) ونحترم التنسيق المفروض.
في البداية ، يبدو النموذج كما يلي:
framework Laravel MVC
شكل فارغ
بعد الارسال والعودة بأخطاء ، يمكن أن يبدو كالتالي:
framework Laravel MVC
النموذج مع الأخطاء
تلقائيا تكون الرسائل باللغة الإنجليزية. للحصول على هذه النصوص باللغة الفرنسية او غيرها ، يجب عليك استرداد الملفات الموجودة على  هذا الموقع . ضع المجلد "fr" ومحتوياته في المجلد resources/lang. ثم قم بتغيير هذا الخط في الملف config/app.php  :
'locale' => 'fr' ،
يجب أن يكون لديك Laravel باللغة الفرنسية:
framework Laravel MVC
رسائل باللغة الفرنسية
عرض التأكيد confirmation view
بالنسبة إلى عرض التأكيد ( resources/views/confirm.blade.php) ، يكون الكود أبسطًا ومن الواضح أننا نستخدم نفس القالب:

@extends('template')

@section('contenu')
    <br>
    <div class="col-sm-offset-3 col-sm-6">
        <div class="panel panel-info">
            <div class="panel-heading">Contactez-moi</div>
            <div class="panel-body"> 
                Merci. Votre message a été transmis à l'administrateur du site. Vous recevrez une réponse rapidement.
            </div>
        </div>
    </div>
@endsection
مما يعطي هذا المظهر:
framework Laravel MVC
التأكيد
عرض البريد الإلكتروني للمسؤول (admin)
نحتاج أيضًا إلى إنشاء طريقة عرض لإنشاء البريد الإلكتروني للمسؤول ( resources/views/email_contact.blade.php) :

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <h2>Prise de contact sur mon beau site</h2>
    <p>Réception d'une prise de contact avec les éléments suivants :</p>
    <ul>
      <li><strong>Nom</strong> : { { $nom }}</li>
      <li><strong>Email</strong> : { { $email }}</li>
      <li><strong>Message</strong> : { { $texte }}</li>
    </ul>
  </body>
</html>
يجب تمرير إدخال المستخدم إلى هذا العرض.

طلب النموذج


لدى Laravel أداة ترتيب تسمى Artisan والتي استخدمناها بالفعل والتي تجعل من الممكن تنفيذ العديد من العمليات.
بالنسبة للأشخاص الذين يعانون من الحساسية تجاه وحدة التحكم ، قمت بإنشاء  حزمة  تسمح لك بطلب Artisan بواجهة سهلة الاستخدام.
يمكنك الوصول إلى Artisan على مستوى وحدة التحكم: 

php artisan
من بين العديد من الاحتمالات التي سنستخدمها make:request لإنشاء طلب النموذج الخاص بنا:

php artisan make:request ContactRequest
Request created successfully.
يتم إنشاء الاستعلام هنا:
framework Laravel MVC
طلب النموذج
دعونا نرى الكود الذي تم إنشاؤه:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class ContactRequest extends Request {

    /**
     * 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()
    {
        return [
            //
        ];
    }

}
فئة ولدت لديها 2 طرق:
  • authorize : لإجراء فحص أمني محتمل لهوية أو حقوق المصدر ،
  • rules  : لقواعد التحقق من الصحة.
سنصلح كود حالتنا:

<?php

namespace App\Http\Requests;

class ContactRequest extends Request {

    /**
     * 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 [
            'nom' => 'required|min:5|max:20|alpha',
            'email' => 'required|email',
            'texte' => 'required|max:250'
        ];
    }

}
على مستوى الطريقة ، rules نرجع صفيفًا يحتوي على مفاتيح تتوافق مع حقول النموذج. يمكنك العثور على الاسم والبريد الإلكتروني والنص. تحتوي القيم على قواعد التحقق من الصحة. نظرًا لوجود العديد منها في كل مرة ، يتم فصلها بواسطة علامة "|" . دعونا نرى القواعد المختلفة المقدمة:
  • Required : قيمة مطلوبة ، لذلك يجب ألا يكون الحقل فارغًا ،
  • min  : الحد الأدنى لعدد الأحرف، على سبيل المثال، min:5  تعني "5 أحرف على الأقل"
  • max  : عكس "min" مع أقصى عدد من الأحرف ،
  • alpha  : تقبل فقط الأحرف الأبجدية ،
  • email  : يجب أن تكون القيمة عنوان بريد إلكتروني صالح.
بالنسبة لطريقة التفويض authorize ، تُرجع True فقط لأننا لن نقوم بأي عمليات فحص إضافية. 
هناك قاعدة between:min,max   تلخص استخدام القاعدتين max:value  و min:value . يمكنك العثور على جميع القواعد المتاحة  في الوثائق . سترى أن القائمة طويلة!

المراقب


هنا هو كود وحدة التحكم ContactController  :

<?php

namespace App\Http\Controllers;

use Mail;
use App\Http\Requests\ContactRequest;

class ContactController extends Controller {

    public function getForm()
    {
        return view('contact');
    }

    public function postForm(ContactRequest $request)
    {
        Mail::send('email_contact', $request->all(), function($message) 
        {
            $message->to('monadresse@free.fr')->subject('Contact');
        });

        return view('confirm');
    }

}
لا تقدم الطريقة getForm   أي شيء جديد مقارنة بما رأيناه في الفصل السابق. نرجع فقط طريقة العرض contact  التي تحتوي على النموذج.
طريقة postForm  تتطلب بعض التعليقات. لاحظ المُدخلات من نوع ContactRequest . نحقن في الطريقة مثيل للفئة ContactRequest  التي أنشأناها سابقًا .  Laravel يسمح بهذا النوع من حقن التبعية على مستوى الطريقة. سأعود بالتفصيل في فصل مستقبلي حول هذا الاحتمال.
إذا فشل التحقق من الصحة بسبب عدم احترام قاعدة ، فإن الفصل هو ContactRequest  الذي يعتني بكل شيء ، ويعيد النموذج عن طريق إكمال عمليات التحقق التي كانت صحيحة وإنشاء متغير $errors  لنقل رسائل الخطأ التي نستخدمها في العرض. ليس عليك أن تفعل أي شيء آخر!
استخدمت الواجهة Mail، ويمكنني أيضًا حقن كائن في الطريقة كما فعلت مع طلب النموذج. سنرى في فصل لاحق حقنة الاعتماد مع حالات الاستخدام الأخرى.
إرسال رسالة إلكترونية
إذا نجحت عملية التحقق ، يتم إرسال بريد إلكتروني إلى المسؤول:

<?php
Mail::send('email_contact', $request->all(), function($message) 
{
    $message->to('monadresse@free.fr')->subject('Contact');
});
يستخدم Laravel SwiftMailer لإنجاز هذه المهمة. بناء الجملة بسيط: نحن نستخدم فئة الرسائل ( Mail) لإرسال ( send) رسالة بريد إلكتروني تتضمن محتوى العرض "email_contact" عن طريق إرسال عناصر الطلب ( $request) إلى طريقة العرض هذه عن طريق تحديد أننا نريدهم جميعًا ( all) . نرسل هذا البريد الإلكتروني إلى ( to) "monadresse@free.fr" مع الموضوع ( subject) "جهة الاتصال" .
لكي يعمل إرسال البريد الإلكتروني ، يجب عليك إدخال العناصر التالية في الملف .env  :

MAIL_DRIVER=smtp
MAIL_HOST=smtp.free.fr
MAIL_PORT=25
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
وكذلك هذا الخط في config/mail.php :

'from' => ['address' => 'moi@free.fr', 'name' => 'Administrateur'],
يتوافق التكوين هنا مع مضيفي (free) لاختباراتي محليًا. إذا كان لديك مضيف مختلف ، فمن الواضح أنه سيتعين عليك تكييف هذه القيم. وبالمثل إذا وضعت موقعًا في الإنتاج على خادم.
إذا سارت الأمور على ما يرام ، يجب أن تتلقى رسالة بريد إلكتروني مثل هذا:
framework Laravel MVC
البريد الإلكتروني للمسؤول
فيما يلي توضيح عام لكيفية عملها:
framework Laravel MVC
الأداء العام

في الخلاصة


  • التحقق من الصحة هو خطوة أساسية في التحقق من إدخال العميل.
  • هناك العديد من قواعد التحقق من الصحة.
  • يقوم المدقق بإنشاء أخطاء صريحة لعرضها على العميل.
  • للحصول على نصوص الخطأ بلغة أخرى غير الانجليزية ، يجب عليك الحصول على الترجمات ووضعها في المجلد الصحيح.
  • Laravel يسمح بإرسال رسائل البريد الإلكتروني بسيطة.