اكتشف إطار PHP Laravel


الدرس: الإدخالات


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

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


سننظر في سيناريو صغير مع طلب نموذج من جانب العميل وتقديمه ومعاملته:
framework Laravel MVC
سيناريو
لذلك سنحتاج إلى طريقين:
  1. 1. واحد لطلب النموذج بأسلوب "get"
  2. 2. واحد لتقديم النموذج مع طريقة post""
لذلك سننشئ هذين الطريقين في الملف app/Http/routes.php  :

<?php
Route::get('users', 'UsersController@getInfos');
Route::post('users', 'UsersController@postInfos');
حتى ذلك الحين لم نر سوى طرق مع الاسلوب "get" ، لدينا الآن أيضًا طريق مع الأسلوب "post" .
يسمح Laravel بأسليب أخرى مثل "put" و "delete" أو عدة أساليب لنفس المسار مع "match" وحتى كل الأساليب مع "any" .
  1. http://monsite.fr/users  باستخدام طريقة "get"
  2. http://monsite.fr/users  مع طريقة post""
لذلك لدينا نفس عنوان url ، يختلف الفعل فقط. هنا هو السيناريو الذي يظهر مع عناوين المواقع:
framework Laravel MVC
عناوين url للنص

الوسيطة middleware


سأتحدث أكثر عن الوسيطة في فصل لاحق. في الوقت الحالي ، سنكون راضين لمعرفة أنه كود يتم تنشيطه عند وصول الطلب (أو عند مغادرته) لإجراء معالجة. من المفيد إيقاف الطلب ، على سبيل المثال ، مباشرةً إذا كانت هناك مشكلة أمنية.
يمكن استخدام Laravel كتطبيق "ويب" أو "API" . في الحالة الأولى نحتاج:
  • إدارة ملفات تعريف الارتباط cookies،
  • لإدارة الجلسة sessions،
  • إدارة حماية CSRF (التي أتحدث عنها لاحقًا في هذا الفصل) .
إذا نظرت إلى ملف التطبيق / Http / Kernel.php : 

<?php
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
    ],
];
نجد اثنين من البرامج الوسيطة لمجموعات "الويب" و "api". نرى أنه في الحالة الأولى ، نقوم بتنشيط ملفات تعريف الارتباط ، الجلسات ، والتحقق من CSRF.
بشكل تلقائي ، app/Http/routes.php  يتم تضمين جميع المسارات التي تدخلها في الملف في مجموعة web"". إذا نظرت إلى الموفر app/Providers/RouteServiceProvider.php  تجد هذا التضمين:

<?php
protected function mapWebRoutes(Router $router)
{
    $router->group([
        'namespace' => $this->namespace, 'middleware' => 'web',
    ], function ($router) {
        require app_path('Http/routes.php');
    });
}

النموذج


للقيام بالأشياء بشكل صحيح ، سنقدم نموذجًا   resources/views/template.blade.php  :

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
</head>
<body>
    </body>
</html>
وطريقة عرض resources/views/infos.blade.php  تستخدم هذا القالب:

<?php
@extends('template')

@section('contenu')
    {!! Form::open(['url' => 'users']) !!}
        {!! Form::label('nom', 'Entrez votre nom : ') !!}
        {!! Form::text('nom') !!}
        {!! Form::submit('Envoyer !') !!}
    {!! Form::close() !!}
@endsection
لقد رأينا بالفعل كيف يتم تنظيم طريقة عرض باستخدام قالب ، ولكن إنشاء النموذج يستحق بعض التعليقات. لإنشاء نموذج ، يجب عليك أولاً فتحه:

Form::open(['url' => 'users'])
الدلالات بسيطة: نريد نموذجًا ( Form) ، ونفتح ( open) هذا النموذج ، ويشير إلى عنوان url "المستخدمين" .
ثم نريد تسمية ( label) :

Form::label('nom', 'Entrez votre nom : ')
نريد عنصر تحكم نوع "نص" يسمى "اسم" :

Form::text('nom')
نريد أخيرًا زر إرسال ( submit) مع النص ""Envoyer  :

Form::submit('Envoyer !')
وأخيرًا نريد إغلاق  النموذج ( close) :

Form::close()
سيكون الكود الذي تم إنشاؤه للنموذج كما يلي:

<form method="POST" action="http://monsite.fr/users" accept-charset="UTF-8">
    <input name="_token" type="hidden" value="pV1vWWdUqFDfYsBjKag43C3NvzbIC0lHtMnv9BpI">    
    <label for="nom">Entrez votre nom : </label>    
    <input name="nom" type="text" id="nom">    
    <input type="submit" value="Envoyer !"> 
</form>
بعض الملاحظات:
  • الطريقة التلقائية هي "post" ، لم نكن بحاجة إلى تحديدها ،
  • يتم إنشاء العمل بشكل جيد ،
  • هناك عنصر تحكم مخفي ( _token ) مخصص لحماية CSRF والذي سأتحدث عنه لاحقًا ،
  • تم إنشاء التسمية بشكل جيد مع السمة "for" ،
  • عنصر تحكم النص من النوع الصحيح بالاسم الصحيح ، كما يتم إنشاء معرف بحيث يعمل مع التسمية الخاصة به ،
  • تم إنشاء زر إرسال بنصه.
ستكون النتيجة:
framework Laravel MVC
الشكل المُوّلد
إذا لم يتم إنشاء النموذج الخاص بك ، فربما لم تقم بتحميل المكون Laravelcollective\Html  كما رأينا في فصل التثبيت.
ليس عليك استخدام هذا المكون لإنشاء نماذج ، لكنني أشجعك على القيام بذلك لأنه يبسط كتابة الكود وأستخدامه خلال هذه الدورة التدريبية. على سبيل المثال ، لإنشاء النموذج دون استخدامه ، يتعين علينا كتابة هذا:

@extends('template')

@section('contenu')
    <form method="POST" action="{!! url('users') !!}" accept-charset="UTF-8">
        {!! csrf_field() !!}   
        <label for="nom">Entrez votre nom : </label>    
        <input name="nom" type="text" id="nom">    
        <input type="submit" value="Envoyer !"> 
    </form>
@endsection

المراقب CONTROLLER


نحن فقط بحاجة إلى وحدة التحكم لجعلها تعمل:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class UsersController extends Controller
{

    public function getInfos()
    {
        return view('infos');
    }

    public function postInfos(Request $request)
    {
        return 'Le nom est ' . $request->input('nom'); 
    }

}
وحدة التحكم الخاصة بي بها طريقتان:
  1. الطريقة getInfos  التي تستقبل عنوان url  http://monsite.fr/users  مع الفعل "get" والتي تُرجع النموذج ،
  2. الطريقة postInfos  التي تستقبل عنوان url  http://monsite.fr/users  مع الفعل "post" والذي يعالج الإدخالات.
بالنسبة للطريقة الأولى ، لا يوجد شيء جديد وأحيلك إلى الفصول السابقة إذا كان هناك شيء ما غير واضح لك. من ناحية أخرى ، نحن مهتمون بالطريقة الثانية.
في هذه الطريقة الثانية، نريد استرداد الإدخال من العميل. مرة أخرى، يكون بناء الجملة واضحًا: نحن نريد في request ( $request) الإدخالات ( input) استرداد ما يسمى "name" .
إذا قمت بكل هذا العمل ، يجب عليك أخيرًا الحصول على عرض الاسم الذي تم إدخاله. فيما يلي مخطط للعملية التي تستثني الطرق لتبسيطها:
framework Laravel MVC
السيناريو :
(1) يرسل العميل طلب طلب النموذج الذي يتم إرساله إلى وحدة التحكم عن طريق Route (لا يظهر في الرسم التخطيطي) ،
(2) يقوم جهاز التحكم بإنشاء طريقة العرض infos" "
(3) تقوم طريقة عرض "infos" بإنشاء النموذج ،
(4) يتم إرسال النموذج إلى العميل ،
(5) يقدم العميل النموذج ، ويتلقى المراقب طلب التقديم عبر المسار (غير موضح في الرسم التخطيطي) ،
(6) وحدة التحكم تنشئ استجابة ،
(7) يتم إرسال الاستجابة إلى العميل.
هناك الواجهة Request  التي تسمح أيضًا باستعادة الإدخالات:

<?php
Request::input('nom')

حماية CSRF


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

<input name="_token" type="hidden" value="pV1vWWdUqFDfYsBjKag43C3NvzbIC0lHtMnv9BpI">
ما هذا؟
بادئ ذي بدء CSRF لتقف تعني  Cross-Site Request Forgery . إنه هجوم الكتروني يتكون من إرسال العميل لطلب دون علمه. يعد هذا الهجوم بسيطًا نسبيًا ويتألف من إرسال نص مخفي (في صفحة ويب أو بريد إلكتروني) إلى عميل مصادق عليه على أحد المواقع لجعله يقوم بإجراء ما دون علمه.
للحماية من هذا النوع من الهجوم ، تقوم Laravel بإنشاء رمز عشوائي مرتبط بالنموذج بحيث يتم التحقق من هذا الرمز المميز عند تقديمه للتأكد من مصدره.
قد تتساءل عن مكان وجود هذه الوسيطة CSRF . إنه مرتب في المجلد App/Http/Middleware :
framework Laravel MVC
الوسيطة CSRF
لاختبار فعالية هذا التحقق ، حاول إرسال نموذج بدون الرمز المميز(token) ، وبالتالي تعديل طريقة العرض (تكييف قيمة الإجراء وفقًا لسياقك):

@extends('template')

@section('contenu')
    <form method="POST" action="http://monsite.fr/users" accept-charset="UTF-8">
        <label for="nom">Entrez votre nom : </label>    
        <input name="nom" type="text" id="nom">    
        <input type="submit" value="Envoyer !"> 
    </form>
@endsection
سوف تصادف هذا الخطأ عند الإرسال:
framework Laravel MVC
خطأ في التحقق من الرمز المميز

في الخلاصة


  • يتيح لك Laravel إنشاء طرق بأفعال مختلفة: get ، post ...
  • يمكن بسهولة إنشاء نموذج باستخدام فئة النموذج.
  • يتم استرداد إدخالات العميل في الطلب.
  • يمكننا حماية هجمات CSRF ، يتم إعداد هذا الدفاع تلقائيًا بواسطة Laravel .