كان من الشائع في بدايات التطوير للوب كتابةُ الاستمارات بوسوم HTML ثم إضافة شفرة مخصَّصة للتأكد من مُدخَلات الزائر. وفّرت لغة البرمجة PHP بعد ذلك دوالَّ معيارية للتحقّق من المُدخلات؛ خفّفت هذه الدوّال قليلا من العبء على المطوِّر إلا أنها تركت له مهمّة تعريف طريقة للتحقّق من المُدخلات ومن ثمّ معالجتها أو إشعار الزائر بالبيانات غير الصالحة وعرض الاستمارة من جديد. يزيح Laravel هذه المتاعب بتوفير شيفرة للتحقّق وطريقة للتعامل مع المُدخلات.
يقدّم هذا المقال دليلا لكيفيّة إنشاء استمارات والتحقّق من مدخلات الزائر في Laravel. سنأخذ مثالا لإضافة تصنيف Category ضمن جدول تصنيفات Categories في تطبيق؛ يمكن أن يتعلّق الأمر بتصنيف منشورات مدوّنة، منتجات متجر أو أي شيء مماثل.
تهيئة تطبيق Laravel
نفترض أن Laravel مثبَّت وجاهز للعمل مع قاعدة البيانات. نهيّئ التطبيق قبل أن نشرع في إنشاء الاستمارة وأدوات التحقّق المصاحبة لها.
إنشاء نموذج التصنيف والتهجير الموافق له
سيتكون نموذج التصنيف من حقل للاسم إضافة إلى حقل المعرّف id
والأختام الزمنية Timestamps. نستخدم artisan
لتوليد النموذج والتهجير:
$ php artisan make:model Category -m Model created successfully. Created Migration: 2016_06_13_010501_create_categories_table
ثم نفتح ملفّ التهجير (داخل المجلّد database/migrations
) ونحدّث الدالة up
على النحو التالي:
public function up() { Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }
ثم ننفّذ التهجير:
$ php artisan migrate Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2016_06_13_010501_create_categories_table
ننتقل الآن للعمل على المتحكّم Controller الذي سيكون المسؤول عن معالجة محتوى الاستمارة.
إنشاء المتحكم وتعريف المسارات
نستخدم أداة artisan
لإنشاء المتحكّم الذي سنستخدمه - من بين أمور أخرى - لعرض النموذج ومعالجة بياناته:
$ php artisan make:controller CategoriesController.php --resource Controller created successfully.
ينشئ أمر make:controller
عند استخدام المعطى resource--
متحكّما بدوال update
، edit
، store
، create
، show``index
وdestroy
. راجع درس أساسيات بناء التطبيقات في إطار العمل Laravel 5 للمزيد عن هذه الدوال.
بقي لنا تعريف المسارات في الملفّ app/Http/routes.php
؛ نستخدم Route::resource
لهذا الغرض:
Route::resource('categories', 'CategoriesController');
إنشاء العروض Views
نركّز لأغراض هذا الدّرس على الدالتيْن create
وstore
المسؤولتيْن على التوالي عن عرض الاستمارة وتخزين بياناتها (في حال تجاوز اختبار التحقّق؛ كما سنرى). تبدو الدالتان لحدّ الساعة فارغتيْن:
public function create() { // } public function store(Request $request) { // } ...
نحدّث الدالة create
كالتالي:
public function create() { return view('categories.create'); }
أي أننا نطلُب تقديم العرض create.blade.php
الموجود في المجلّد resources/views/categories
. ننشئ المجلّد categories
وننشئ بداخله الملفّ create.blade.php
. سنكتفي الآن بإضافة الوسوم التالية إلى ملفّ العرض:
<h1>Create a Category</h1>
يمكنك بعد حفظ الملفّ زيارة الرابط categories/create/
وسيظهر العنوان أعلاه.
إنشاء استمارة في Laravel
نريد أن نعرض للزائر استمارة لملئها؛ يمكن أن ننشئ هذه الاستمارة بكتابة وسوم HTML المطلوبة في ملفّ العرض create
؛ إلا أنه يمكننا الاستفادة من حزمة laravelcollective/html
لتولّي هذه المهمّة. نضيف الحزمة إلى مشروع Laravel بتنفيذ الأمر التالي داخل مجلّد المشروع:
$ composer require laravelcollective/html
ثم نفتح ملفّ الإعداد config/app
ونضيف السطر التالي إلى مصفوفة providers
:
Collective\Html\HtmlServiceProvider::class,
لتبدو المصفوفة كالتالي (نزعنا بعض محتويات المصفوفة للاختصار):
'providers' => [ ... App\Providers\AuthServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, Collective\Html\HtmlServiceProvider::class, ]
نكمل مع نفس الملفّ بالانتقال إلى المصفوفة aliases
التي نضيف إليها السّطر التالي:
'Form' => Collective\Html\FormFacade::class
لتصبح كما يلي:
'aliases' => [ ... 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, 'Form' => Collective\Html\FormFacade::class ]
احفظ الملفّ.
أكملنا تثبيت الحزمة وإعدادها. نعيد فتح ملفّ العرض create
ونعدّل محتواه ليصبح على النحو التالي:
<h1>Create a Category</h1> {!! Form::open( array( 'route' => 'categories.store', 'class' => 'form') ) !!} @if (count($errors) > 0) <div class="alert alert-danger"> There were some problems adding the category.<br /> <ul> @foreach ($errors->all() as $error) <li></li> @endforeach </ul> </div> @endif <div class="form-group"> {!! Form::label('Category') !!} {!! Form::text('name', null, array( 'class'=>'form-control', 'placeholder'=>'List Name' )) !!} </div> <div class="form-group"> {!! Form::submit('Create Category!', array('class'=>'btn btn-primary' )) !!} </div> {!! Form::close() !!} </div>
تضيف حزمة laravelcollective/html
تعليمات خاصّة بإنشاء الاستمارات إلى نظام Blade للقوالب.
-
يشير مسار الاستمارة إلى
categories/store
لأن دالّةstore
في المتحكّمCategoriesController
هي التي ستتولّى معالجة بيانات الاستمارة. تستخدم التعليمةForm::open
مبدئيا إجراءPOST
؛ لذا لا حاجة لتعيينه. -
يُستخدَم المقطع
if..@endif@
لتقديم معلومات إلى المستخدم عن أخطاء التحقق. سنفصّل هذا الأمر بعد قليل. - مرّرنا لأغراض جمالية أصنافا وخاصيّات من Bootstrap إلى الاستمارة ؛ هذا ليس ضروريا وستعمل الاستمارة بدونه.
تظهر الآن الاستمارة بالذهاب إلى categories/create/
.
يمكنك إدخال اسم تصنيف وإرسال الاستمارة وستُوجَّه إلى categories/store/
لكنّ شيئا لن يحدُث لأننا لم نكتب حتى الآن شيئا في الدالة store
من المتحكّم CategoriesController
.
معالجة الاستمارة
نعود للدالة store
في المتحكم CategoriesController
. هذه هي الدالة التي تُرسَل إليها بيانات الاستمارة بعد النقر على زرّ الإرسال. نحدّث المتحكّم كالتالي:
use App\Category; ... public function store(Request $request) { $category = new Category; $category->name = $request->get('name'); $category->save(); return \Redirect::route('categories.show', array($category->id)); }
بدأنا أولا باستيراد النموذج Category
في المتحكّم ثم استخدمناه في الدالة store
لتخزين تسجيلة Record جديدة في جدول قاعدة البيانات اعتمادا على محتويات الاستمارة؛ ثم بعد التخزين نعيد توجيه المستخدم إلى الدالة show
ضمن المتحكّم CategoriesController
مع معرّف التصنيف الذي أضفناه للتو. يمكننا تعديل الدالة show
كالتالي لعرض رسالة تفيد بنجاح إضافة التصنيف:
public function show($id) { // $category = Category::find($id); $message = "$category->name has been added succefully"; return $message; }
من الملاحظ أننا لم نتحقّق في العمليّة السابقة من مُدخلات المستخدم. يعني هذا أنه يمكن - مثلا - ترك الحقل الخاصّ باسم التصنيف فارغا وسيُحفظ تصنيف بدون اسم في قاعدة البيانات؛ طبعا هذا غير مقبول.
التحقق من الاستمارة قبل الإرسال
يوفّر Laravel 5 ميزة تُسمى طلب الاستمارة Form request تسمح بالتحقق من حقول الاستمارة دون تلويث المتحكّم. يدير ملفّ منفصل قواعد التحقّق من الاستمارة؛ نستخدم أمر artisan
التالي لإنشاء هذا الملفّ:
$ php artisan make:request CreateCategoryFormRequest Request created successfully.
ينشئ الأمر ملفا باسم CreateCategoryFormRequest.php
في المجلد app/Http/Requests
. يبدو الملفّ كالتالي:
<?php namespace App\Http\Requests; use App\Http\Requests\Request; class CreateCategoryFormRequest extends Request { public function authorize() { return false; } public function rules() { return [ // ]; } }
عدّل الدالة authorize
كالتالي:
public function authorize() { return true; }
نحتاج لتحديد القيمة true
بالنسبة للدالة authorize
لأنه في حال كانت القيمة false
فلن تُعالج بيانات الاستمارة.
ثم نعدّل الدالة rules
:
public function rules() { return [ 'name' => 'required' ]; }
تعرّف الدالة قواعد التحقّق؛ عرّفنا أعلاه الحقل name
ضمن الاستمارة بأنه مطلوب required
؛ أي أن الاستمارة لن تُرسَل إلا إذا كانت توجد قيمة لهذا الحقل. تمكن إضافة أكثر من شرط على الحقل كالتالي:
'name' => 'required|alpha'
نحتاج الآن لدمج طلب الاستمارة في الدالة store
ضمن المتحكّم CategoriesController
. نبدأ باستيراد الصنف في المتحكّم كالتالي:
use App\Http\Requests\CreateCategoryFormRequest;
ثم نحدّث الدالة store
ليكون الكائن الممرَّر إليها من الصّنف CreateCategoryFormRequest
:
public function store(CreateCategoryFormRequest $request) { ... }
ابتداءً من الآن سيتحقّق Laravel من بيانات الحقل قبل إرسالها؛ وفي حال الإخفاق في التحقق من الشرط سيعيد الزائر إلى صفحة الاستمارة مع عرض رسالة بوجود خطأ.
ترجمة -وبتصرّف- للمقال Creating and Validating a Laravel 5 Form: The Definitive Guide. حقوق المقال محفوظة لصاحبه W. Jason Gilmore.
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.