اكتشف إطار PHP Laravel


الدرس: التوجيه والواجهات


الصفحة السابقة
في هذا الفصل ، سنركز على مستقبل طلب HTTP الذي يصل إلى تطبيق Laravel الخاص بنا. سنرى ميزة استخدام ملف htaccess لتبسيط عنوان url . سنرى أيضًا نظام التوجيه لفرز الطلبات.

طلبات HTTP


تذكير قليلا
سنبدأ بتذكير قليل حول ماهية طلب HTTP . فيما يلي رسم توضيحي:
framework Laravel MVC
طلبات HTTP
HTTP (بروتوكول نقل النص التشعبي) هو بروتوكول اتصال بين العميل والخادم. يطلب العميل صفحة من الخادم عن طريق إرسال طلب ويستجيب الخادم عن طريق إرسال استجابة ، وعادة ما تكون صفحة HTML .
يحتوي طلب العميل على قدر معين من المعلومات ، لكننا سنركز فقط على اثنين منهم في الوقت الحالي:
  • على طريقة: : get, post, put, delete ...
  • url : هذا هو عنوان الصفحة المطلوبة على الخادم
يجب أن يعرف تطبيق Laravel الخاص بنا كيفية ترجمة هذه المعلومات واستخدامها بطريقة ملائمة لإرجاع ما يطلبه العميل. سوف نرى كيف يتم ذلك.
. htaccess و index.php
نريد أن تنتهي جميع الاستعلامات بالضرورة في الملف index.php  الموجود في المجلد public . للوصول إلى هناك ، يمكنك استخدام عنوان URL مثل هذا:
http://monsite.fr/index.php/mapage
لكنها ليست جمالية للغاية مع هذا  index.php في الوسط. إذا كان لديك خادم Apache عندما يصل طلب العميل إلى الخادم حيث يوجد تطبيق Laravel الخاص بنا ، فإنه يمر أولاً بالملف .htaccess ، إذا كان موجودًا ، والذي يحدد القواعد الخاصة بالخادم. يوجد ملف  .htaccess في المجلد public في Laravel مع قاعدة إعادة الكتابة حتى نتمكن من الحصول على عنوان url مبسط:
http://monsite.fr/mapage
رسم تخطيطي صغير لتصور هذا الإجراء:
framework Laravel MVC
إعادة كتابة URL
لكي يعمل هذا ، يجب أن يكون في خادم Apache   الوحدة mod_rewrite  مفعلةً.
إذا كنت لا تستخدم Apache ولكن Nginx ، فيجب عليك استخدام هذا التوجيه:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
دورة الطلب
عندما يصل الطلب إلى الملف ، public/index.php  يتم إنشاء تطبيق Laravel وتكوينه واكتشاف البيئة. سوف نعود إلى هذه المراحل لاحقًا بمزيد من التفصيل. ثم   يتم تحميل الملف routes.php . هنا هو موقع الملف:
framework Laravel MVC
ملف routes
من خلال هذا الملف سيتم تحليل الطلب وتوجيهه. دعونا نرى ما نجده في البداية:

<?php
Route::get('/', function () {
    return view('welcome');
});
نظرًا لأن Laravel صريح ، يمكنك بالفعل تخمين معنى هذا الكود:
  • Route : نستخدم جهاز التوجيه ،
  • get  : نتحقق مما إذا كان الطلب يحتوي على طريقة "get" ،
  • '/'  : نتحقق مما إذا كان عنوان url يحتوي فقط على اسم النطاق ،
  • في الدالة المجهولة نرجع ( return) طريقة عرض ( view ) من ملف welcome"" .
يتم تخزين ملف welcome"" هذا في مجلد طرق العرض:
framework Laravel MVC
عرض welcome"" في مجلد طرق العرض
هذا الملف يحتوي على كود html الذي يولد نص الترحيب الذي تحصل عليه عند بدء تشغيل Laravel لأول مرة. 
يقدم Laravel عدة مساعدين يبسطون بناء الجملة. يوجد على سبيل المثال   view فئة العرض كما رأينا في الكود أعلاه. وقد تم تجهيز Laravel مع العديد من المساعدين مثل هذا الذي يسهل ويسرّع كتابة الكود.
دعنا نتصور دورة الطلب:
framework Laravel MVC
دورة الطلب
ليس لديك اسم مجال على الخادم المحلي الخاص بك ، وسوف تستخدم عنوان url للنموذج على http://localhost/tuto/public  افتراض أنك قمت بإنشاء Laravel في مجلد www/tuto . ولكن يمكنك أيضًا إنشاء مضيف افتراضي ليكون له موقف أكثر واقعية.

العديد من الطرق وتحديد الطريق


عند التثبيت ، يحتوي Laravel على مسار واحد فقط يتوافق مع عنوان url الأساسي المكون فقط من اسم المجال. الآن دعونا نرى كيفية إنشاء طرق أخرى. تخيل أن لدينا 3 صفحات يجب عرضها مع عناوين url هذه:
  1. http://monsite.fr/ 1
  2. http://monsite.fr/ 2
  3. http://monsite.fr/ 3
لقد أظهرت بالخط العريض الجزء المحدد من عنوان url لكل صفحة. من السهل القيام بذلك باستخدام هذا الكود:

<?php
Route::get('1', function() { return 'Je suis la page 1 !'; });
Route::get('2', function() { return 'Je suis la page 2 !'; });
Route::get('3', function() { return 'Je suis la page 3 !'; });
هذه المرة لم أقوم بإنشاء طريقة عرض لأن ما يهمنا هو مجرد تسليط الضوء على التوجيه ، لذلك أعيد الاستجابة مباشرةً إلى العميل. دعونا نرى هذا للصفحة 1
framework Laravel MVC
طلب من الصفحة 1
تحتاج فقط إلى الحرف "/" في المسار الأساسي.
يمكننا الآن أن نسأل أنفسنا سؤالًا: هل من الضروري حقًا إنشاء 3 طرق عندما يكون الاختلاف الوحيد ناتجًا عن القليل: قيمة تتغير. يمكنك استخدام مُدخل لطريق يقبل العناصر المتغيرة باستخدام الأقواس. انظر إلى هذا الكود:

<?php
Route::get('{n}', function($n) {
    return 'Je suis la page ' . $n . ' !'; 
});
framework Laravel MVC
طريق تكوينه
يمكن جعل المُدخل اختياريا عن طريق إضافة علامة استفهام إليها ، ولكن يجب ألا تتبعها مُدخلا إلزاميا.

خطأ وقت التشغيل وتقييد الطريق


في المثال السابق المزدوج الخاص بي عندما أقول إن النتيجة هي نفسها بالضبط أكذب قليلاً. ما يحدث في كلتا الحالتين لعنوان URL هذا:
http://monsite.fr/4
في حالة الطرق الثلاثة التي تصادفك خطأ:
framework Laravel MVC
خطأ وقت التشغيل: المسار غير موجود
من ناحية أخرى في الإصدار مع المُدخل تحصل على إجابة صحيحة:
Je suis la page 4 !
وهذا أمر منطقي لأنه تم العثور على الطريق. يقبل المُدخل أي قيمة ، وليس فقط الأرقام. على سبيل المثال مع عنوان url هذا:
http://monsite.fr/nimportequoi
أنت تحصل على:
Je suis la page nimportequoi !
ما تعترف به ليس سعيدًا جدًا!
لتجنب هذا النوع من الإزعاج ، يجب إجبار المُدخل على قبول قيم معينة فقط. نحن نفعل هذا باستخدام تعبير عادي:

<?php
Route::get('{n}', function($n) { 
    return 'Je suis la page ' . $n . ' !'; 
})->where('n', '[1-3]');
الآن أستطيع أن أقول أن السلوكيات متطابقة! لكن سيتعين علينا حل مشكلة الطرق غير المخطط لها. سوف نرى ذلك في الفصل التالي.

طريق مُسمى


من المفيد في بعض الأحيان تسمية مسار ، على سبيل المثال لإنشاء عنوان URL أو إجراء إعادة توجيه. بناء جملة تسمية المسار هو:

<?php
Route::get('/', ['as' => 'home', function()
{
  return 'Je suis la page d\'accueil !';
}]);
سنرى حالات استخدام المسارات المحددة في الفصول التالية.

الواجهات


يقدم Laravel العديد من الواجهات لتبسيط بناء الجملة. يمكنك العثور عليها جميعًا معلن عنها في الملف config/app.php :

<?php
'aliases' => [
    'App'       => Illuminate\Support\Facades\App::class,
    'Artisan'   => Illuminate\Support\Facades\Artisan::class,
    'Auth'      => Illuminate\Support\Facades\Auth::class,
    'Blade'     => Illuminate\Support\Facades\Blade::class,
    'Cache'     => Illuminate\Support\Facades\Cache::class,
    'Config'    => Illuminate\Support\Facades\Config::class,
    'Cookie'    => Illuminate\Support\Facades\Cookie::class,
    'Crypt'     => Illuminate\Support\Facades\Crypt::class,
    'DB'        => Illuminate\Support\Facades\DB::class,
    'Eloquent'  => Illuminate\Database\Eloquent\Model::class,
    'Event'     => Illuminate\Support\Facades\Event::class,
    'File'      => Illuminate\Support\Facades\File::class,
    'Gate'      => Illuminate\Support\Facades\Gate::class,
    'Hash'      => Illuminate\Support\Facades\Hash::class,
    'Lang'      => Illuminate\Support\Facades\Lang::class,
    'Log'       => Illuminate\Support\Facades\Log::class,
    'Mail'      => Illuminate\Support\Facades\Mail::class,
    'Password'  => Illuminate\Support\Facades\Password::class,
    'Queue'     => Illuminate\Support\Facades\Queue::class,
    'Redirect'  => Illuminate\Support\Facades\Redirect::class,
    'Redis'     => Illuminate\Support\Facades\Redis::class,
    'Request'   => Illuminate\Support\Facades\Request::class,
    'Response'  => Illuminate\Support\Facades\Response::class,
    'Route'     => Illuminate\Support\Facades\Route::class,
    'Schema'    => Illuminate\Support\Facades\Schema::class,
    'Session'   => Illuminate\Support\Facades\Session::class,
    'Storage'   => Illuminate\Support\Facades\Storage::class,
    'URL'       => Illuminate\Support\Facades\URL::class,
    'Validator' => Illuminate\Support\Facades\Validator::class,
    'View'      => Illuminate\Support\Facades\View::class,
    'Form'      => Collective\Html\FormFacade::class,
    'Html'      => Collective\Html\HtmlFacade::class,
],
ستجد في هذا الجدول اسم الواجهة والفئة التي تنشئ هذه الواجهة. على سبيل المثال بالنسبة للطرق ، لدينا الواجهة Route  التي تتوافق مع الفصل Illuminate\Support\Facades\Route . لنلقِ نظرة على هذه الفئة:

<?php

namespace Illuminate\Support\Facades;

/**
 * @see  \Illuminate\Routing\Router
 */
class Route extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return  string
     */
    protected static function getFacadeAccessor()
    {
        return 'router';
    }
}
نُرجع فقط إلى " router . "يجب عليك الانتقال إلى الملف Illuminate\Routing\RoutingServiceProvider للعثور على سجل router :

<?php
/**
 * Register the router instance.
*
 * @return  void
 */
protected function registerRouter()
{
    $this->app['router'] = $this->app->share(function ($app) {
        return new Router($app['events'], $app);
    });
}
يسمح مقدمي الخدمات providers بحفظ المكونات في حاوية Laravel . نعلن هنا "router" ونرى أننا نقوم بإنشاء مثيل لفئة Router (new Router...). الاسم الكامل هو Illuminate\Routing\Router . إذا كنت سترى هذه الفئة ، فستجد الطرق التي استخدمناها في هذه الفئة ، على سبيل المثال get :

<?php
/**
 * Register a new GET route with the router.
 *
 * @param    string  $uri
 * @param    \Closure|array|string  $action
 * @return  \Illuminate\Routing\Route
 */
public function get($uri, $action)
{
    return $this->addRoute(['GET', 'HEAD'], $uri, $action);
}
بمعنى آخر إذا كتبت باستخدام الواجهة:

<?php
Route::get('/', function() { return 'Coucou'; });
أحصل على نفس النتيجة كما لو أنني أكتب و انا ابحث عن router في الحاوية:

<?php
$this->app['router']->get('/', function() { return 'Coucou'; });
أو باستخدام المساعدين helpers :

<?php
app('router')->get('/', function() { return 'Coucou'; });
الفرق هو أن بناء الجملة الأول أكثر بساطة وبديهية ، ولكن بعض الناس لا يحبون هذا النوع من الاستدعاءات الثابتة.

في الخلاصة


  •  Laravel لديه ملف .htaccess  لتبسيط كتابة رابط.
  •  نظام التوجيه بسيط ومباشر.
  •  يمكننا توفير المُدخلات في الطرق.
  •  يمكنك فرض مُدخل لمطابقة تعبير عادي.
  • يمكننا تسمية طريق لتسهيل إنشاء عناوين URL وإعادة التوجيه.
  •  يجب أن نخطط لإدارة كل عنوان url ، حتى أولئك الذين ليس لديهم طريق مخطط له.
  • وقد تم تجهيز Laravel مع العديد من الجبهات التي تبسّط بناء الجملة.
  • هناك أيضًا مساعدين لتبسيط بناء الجملة.