Advertisement
  1. Code
  2. Web Apps
Code

استخدام مكتبة Illuminate مع Eloquent في تطبيق PHP دون استخدام Laravel

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by Mohammed Taher (you can also view the original English article)

Illuminate هو محرّك قواعد البينات الخاص بـ Laravel، ويضمّ إطار العمل Eloquent الذي يعمل من خلال ربط العلاقات بالكائنات (ORM). إن كنت ترغب في بناء تطبيقات PHP مع أطر عمل تعمل من خلال ORM دون استخدام Laravel، فهذا الدرس مناسب لك.

في هذا الدرس، سنقوم ببناء واجهة خلفية لتطبيق لطرح اﻷسئلة واﻷجوبة باستخدام PHP، Illuminate و Eloquent ORM.

متطلبات المشروع:

  1. PHP: 5.5+
  2. MYSQL
  3. Composer

إمكانيات التطبيق

سيؤدي تطبيقنا 10 مهام هي:

  • إضافة مستخدم.
  • إضافة سؤال.
  • إضافة إجابة على السؤال.
  • التصويت على سؤال.
  • الاستعلام عن سؤال مع اﻷجوبة المرتبطة به.
  • الاستعلام عن اﻷسئلة والمستخدمين الذين قاموا بطرح تلك اﻷسئلة.
  • الاستعلام عن أسئلة معينة، واﻷجوبة وعدد اﻷصوات الخاصة بتلك اﻷسئلة.
  • عدّ اﻷسئلة الخاصة بمستخدم معين.
  • تحديث اﻹجابة بواسطة المستخدم.
  • حذف سؤال معين.

في البداية، نُنشئ مجلد المشروع.

سننشئ في مجلد المشروع الرئيسي مجلدًا باسم app، وفي داخل المجلد app ننشئ مجلدين: models و controllers. في الصورة نرى أن اسم مجلد المشروع الرئيسي هو eloquent، ولك مطلق الحرية في استخدام أي اسم آخر.

Our project organization

بعد ذلك ننشئ ملفًا باسم index.php في المجلد الرئيسي للمشروع، في نفس المستوى الذي يتضمن المجلد app.

سنستخدم كذلك git، لذا سننشئ ملفً .gitignore، وهذه الخطوة اختيارية وليست إلزامية.

 بعد ذلك، نبدأ بتثبيت الاعتماديات المطلوبة لهذا المشروع. في المجلد الرئيسي، سننشئ ملف composer.json، ثم نلصق فيه الشيفرة التالية.

لتثبيت قاعدة بيانات Illuminate نضيف الشيفرة التالية إلى ملف composer.json:
“illuminate/database”: “5.1.8”,.

واﻵن نضيف psr-4 autoloading للنماذج والمتحكمات الخاصة بنا:

وهكذا يكون محتوى ملف composer.json بالشكل التالي:

سنقوم اﻵن بتنفيذ اﻷمرين التاليين الخاصين بـ composer في نفس المكان الذي يضمّ الملف composer.json:

سيؤدي ذلك إلى إنشاء مجلد vendor الذي يمكن إضافته إلى ملف gitignore ليتم تجاهله من قبل Git (هذه الخطوة ليست إلزامية).

لنبدأ بإضافة ملف إعدادات يتضمن معلومات الوصول إلى قاعدة البيانات الخاصة بنا.

في المجلد الرئيسي للمشروع سننشئ ملفًا باسم config.php نعرف فيه المعلومات الخاصة بقاعدة البيانات، وبطبيعة الحالة، يجب عليك إدخال المعلومات الخاصة بك في هذا الملف.

بعد ذلك، سنشرع في إنشاء المخطط الخاص بالتطبيق.

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

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

هناك أيضًا عمود ثالث يحمل اسم deleted_at، ولكنه طريقة عمله مختلفة قليلًا، إذ يقدم إطار Eloquent مبدأ الحذف المؤقت soft delete، حيث يعتمد على القيمة الموجودة في العمود deleted_at لتحديد ما إذا سيتم حذف السجلّ من قاعدة البيانات أم لا. إن قمت بحذف أي سجلّ من قاعدة البيانات باستخدام دالة الحذف الخاصة بـ Eloquent مع تفعيل خاصية الحذف المؤقت، سيتم تحديث العمود بالوقت الذي تمت فيه عملية الحذف، ويمكن بعد ذلك استرجاع السجلات المحذوفة في أي وقت.

في هذا التطبيق، سنستفيد من الأختام الزمنية؛ لذا سنستخدم الأعمدة الثلاثة في إنشاء المخطط الخاص بنا.

ابدأ بإنشاء الجداول مستخدمًا اﻷوامر التالية في MySQL:

اﻷسئلة

اﻹجابات

اﻷصوات

المستخدمون

سنبدأ اﻵن بإنشاء الملفات الخاصة بالنماذج والمتحكمات الخاصة بالجداول التي أنشأناها، وذلك في اﻷماكن التالية:

  • project_folder/app/models/question.php
  • project_folder/app/models/answer.php
  • project_folder/app/models/upvote.php
  • project_folder/app/models/user.php
  • project_folder/app/models/database.php
  • project_folder/app/controllers/questions.php
  • project_folder/app/controllers/answers.php
  • project_folder/app/controllers/upvotes.php
  • project_folder/app/controllers/users.php

توجه في محرر النصوص إلى الملف models/database.php.

في البداية ننشئ الكبسولة:

في الملف السابق، أطلقنا الكبسولة وزوّدناها بالثوابت التي قمنا بتعريفها في ملف config.php، ثم أطلقنا إطار العمل eloquent.

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

لذا سننشئ الملف التالي في مجلد المشروع باسم start.php وفي هذا الملف سنضيف ملف التحميل التلقائي autoload الخاص بـ Composer:

require ‘vendor/autoload.php’;

بعد ذلك، سنطلب الملف config.php للحصول على معلومات الاتصال بقاعدة البيانات: require ‘config.php’;

بعد ذلك نقوم بإعداد صنف قاعدة البيانات للشروع بالعمل.

يجب أن يتضمن ملف start.php الشيفرة التالية:

بما أنّ ملف index.php سيكون الملف الرئيسي يجب تضمين الملف start.php فيه.

هكذا يصبح ملف index.php بالشكل التالي:

اﻵن، يمكننا العمل على المتحكمات والنماذج، أضف التالي إلى الملف project_folder/app/models/question.php

ثم أضف ما يلي إلى project_folder/app/controllers/questions.php:

وكذلك اﻷمر في الملف project_folder/app/controllers/answers.php

المهمة اﻷولى: إضافة مستخدم

في النموذج الخاص بالمستخدمين (project_folder/app/models/user.php) أضف الشيفرة التالية لتعريف نطاق الأسماء الخاص بنا، ولكي يرث هذا الصنف من صنف Eloquent Model ولتعريف اسم الجدول (protected $table) والحقول التي يمكن تعبئتها من قبل المستخدم (protected $fillable).

في المتحكم الخاص بالمستخدمين (project_folder/app/controllers/user.php) نعرّف نطاق اﻷسماء والصنف كالمعتاد:

ثم ﻹنشاء مستخدم جديد، نستورد في المتحكم الخاص بالمستخدمين نطاق الأسماء الخاص بنموذج المستخدمين، وذلك من خلال الشيفرة: use Models\User; ثم إضافة دالة ﻹنشاء مستخدم جديد.

سيكون المتحكم الخاص بالمستخدمين بالشكل التالي:

بعد ذلك نضيف اﻷسطر التالية إل ملف index.php ثم نبدأ بتشغيل التطبيق ﻹنشاء مستخدم جديد.

الخطوة الثانية: إضافة سؤال

لإضافة سؤال جديد نستورد نطاق الأسماء الخاص بنموذج اﻷسئلة ضمن المتحكم الخاص بالأسئلة، ثم نكتب دالة باسم create_question وظيفتها إنشاء أسئلة جديدة:

use Models\Question;

بعد ذلك:

لقد استخدمنا هنا خاصية اﻹسناد الشامل mass creation في Eloquent لإدراج المعلومات في سجلّأت قاعدة البيانات، ولكن لتعمل هذه الخاصية يجب إبار إطار العمل بالحقول التي يُسمح لها باستقبال هذه المعلومات؛ ذلك ﻷن نماذج Eloquent محمية بشكل افتراضي تجاه عملية الإسناد الشامل.

لذا توجّه إلى نموذج question وأضف خاصية protected $fillable إلى الصنف.

protected $fillable = ['question','user_id'];

ولتشغيل هذا، قم باستيراد متحكم الأسئلة في ملف Index.php ثم استدع دالة create_question بشكل ساكن statically:

use Controllers\Question;

بعد ذلك أنشئ سؤالاً جديدًا بإضافة نص السؤال ومعرّف المستخدم كمعاملات:

$question = Questions::create_question("Have you ever met your doppelganger?",1);

إن تم هذا اﻷمر بنجاح، فسترجع الدالة عنصر نموذج model object.

واﻵن عليك بإضافة المزيد من المدخلات عن طريق إضافة أسئلة جديدة إلى قاعدة البيانات وذلك باستخدام الشيفرة الموجودة في ملف index.php.

الخطوة الثالثة: إضافة جواب إلى السؤال

هنا سنكرر الخطوات ذاتها التي اعتمدناها في نموذج اﻷسئلة والمستخدمين، وذلك بإضافة الشيفرة التالية:

ثم نضيف اﻷسطر التالية في متحكم اﻹجابات:

ثم في ملف index.php، يمكن إنشاء إجابة خاصة بالسؤال ذي المعرف 1 والتابع للمستخدم ذي المعرف2، الذي قمنا بإنشائه قبل قليل. لا تنس أن تستورد المتحكم الخاص باﻹجابات في بداية ملف index.php.

لتتجنب إدخال معلومات متكررة، حول باقي اﻹيعازات في ملف index.php قبل أن تشغيل الشيفرة.

المهمة الرابعة: التصويت على اﻹجابة

سنكرر الخطوات ذاتها في هذه المهمة أيضًأ.

لذا سننسخ ما يلي إلى نموذج Upvote في الملف project_folder/app/models/upvote.php

ثم في المتحكم الخاص باﻹجابات، نستورد نطاق أسماء النموذج Upvote.

use Models\Upvote;

ثم ننشئ دالة upvote_answer.

يمكننا اﻵن استدعاء هذه الدالة من ملف index.php وذلك باستخدام معرف مستخدم وهمي للتصويت على الإجابة ذات المعرف 1.

$upvote = Answers::upvote_answer(1,14);

الخطوة الخامسة: الاستعلام عن سؤال معين مع اﻷجوبة التابعة له

يمكن استخدام علاقات Eloquent لمثل هذه المهام.

ولهذه العلاقات أنواع مختلفة، مثل واحد لواحد one to one، واحد لمتعدد one to many، ومتعدد لمتعدد many to many وغيرها.

عند استخدام هذه العلاقات، يفترض Eloquent وجود مفتاح خارجي foreign key على هيئة (اسم النموذج_المعرف) في النماذج. في هذه المهمة سنستخدم علاقة واحد لمتعدد وذلك ﻷن السؤال الواحد يمكن أن يتضمن العديد من الإجابات.

في البداية نعرّف العلاقة من خلال إضافة الدالة التالية إلى نموذج اﻷسئلة.

ثم في متحكم اﻷسئلة، نضيف الدالة التالية للاستعلام عن اﻷسئلة مع اﻹجابات التابعة لها.

وبهذا نحصل على اﻷسئلة المطلوبة والإجابات التابعة لكل سؤال.

في ملف index.php، حوّل جميع اﻹيعازات الخاصة بإنشاء سجلات جديدة إلى تعليقات، ثم نفّذ ما يلي:

$all = Questions::get_questions_with_answers();

لمشاهدة نتيجة هذا الاستعلام يمكننا استخدام الدالة var_dump أو print_r مع المتغير $all:

المهمة السادسة: الاستعلام عن جميع اﻷسئلة والمستخدمين الذين طرحوا تلك اﻷسئلة

هنا تكون العلاقة من نوع واحد لواحد، ذلك ﻷن السؤال الواحد يُطرح من قبل مستخدم واحد فقط، لذا سنضيف هذا إلى نموذج الأسئلة:

ثم ننشئ دالة في متحكم اﻷسئلة ونستخدم الدالة with مع نموذج الأسئلة.

في الملف index.php، حول جميع اﻹيعازات السابقة إلى تعليقات، ثم نفّذ ما يلي:

$all_with_users = Questions::get_questions_with_users();

المهمة السابعة: الاستعلام عن سؤال واحد مع اﻹجابات والتصويتات التابعة له

بداية، نعرّف علاقة بين اﻹجابات والتصويتات، وبما أن لسؤال يمكن أن يمتلك العديد من التصويتات، فإن العلاقة بينهما ستكون من نوع واحد لمتعدد.

لهذا، نضيف الدالة التالية إلى نموذج اﻹجابة:

ثم ننشئ في متحكم اﻷسئلة دالة خاصة للاستعلام عن المطلوب:

وكما هو الحال في الخطوات السابقة، حول جميع اﻹيعازات السابقة إلى تعليقات في ملف index.php، ثم نفّذ ما يلي:

$one_question = Questions::get_question_answers_upvotes(1);

يمكن طباعة قيمة المتغيرة $one_question لمشاهدة النتائج:

الخطوة الثامنة: الاستعلام عن عدد اﻷسئلة التابعة لمستخدم معين

في البداية نستورد نموذج السؤال في متحكم المستخدمين:

use Models\Question;

ثم نضيف الدالة التالية:

اﻵن حوّل جميع اﻹيعازات السابقة في ملف index.php إلى تعليقات، وأضف السطر التالي:

$user_question_count = Users::question_count(1);

سيرجع هذا اﻹيعاز عددًا صحيحًا يمثّل عدد اﻷسئلة التي تمت إضافتها من قبل المستخدم الذي يحمل المعرف 1.

يمكن طباعة قيمة المتغير $user_question_count وتشغيل الملف index.php لمشاهدة النتائج.

المهمة التاسعة: تحديث السؤال من قبل المستخدم

إنّ مبدأ التحديث في Eloquent بسيط جدًّا، ويتلخص بالتالي: في البداية نبحث عن السجل المطلوب تحديث، ثم نقوم بإجراء التعديلات المطلوبة ثم الحفظ.

أضف الدالة التالية إلى متحكم اﻷسئلة:

في ملف index.php حوّل جميع اﻹيعازات السابقة إلى تعليقات ثم حدّث الإجابة ذات المعرف 1 بالشكل التالي:

$update_answer = Answers::update_answer(1,”This is an updated answer”);

سيرجع هذا اﻹيعاز قيمة منطقية (true) إن تمت عملية التحديث بنجاح.

المهمة العاشرة: حذف سؤال معين (الحذف المؤقت)

هذه هي المهمة اﻷخيرة، وسنستخدم فيها خاصية الحذف المؤقت SoftDelete التابعة لـ Eloquent.

في البداية يجب إخبار نموذج اﻷسئلة باستخدام الحذف المؤقت SoftDeletes من خلال استيراد نطاق اﻷسماء SoftDeletes واستخدام سمة SoftDeletes في الصنف.

use Illuminate\Database\Eloquent\SoftDeletes;

ثم بعد سطر التصريح السابق، أضف السطر التالي:

use SoftDeletes;

ثم نضيف deleted_at إلى خاصية protected $dates ضمن النموذج، وبهذا يتم تفعيل خاصية الحذف المؤقت.

protected $dates = [‘deleted_at’];

وبهذا يصبح نموذج اﻷسئلة بالشكل التالي:

ننشئ اﻵن دالة delete_question في متحكم الأسئلة:

نفذ ما يلي في ملف index.php:

$delete = Questions::delete_question(1);

تهانينا! لقد قمت بإنشاء واجهة خلفية تعمل بشكل كامل بواسطة Illuminate و Eloquent. هل لاحظت بأننا لم نكن بحاجة إلى كتابة الكثيرة من الشيفرات لتحقيق كل هذا.

يمكن الحصول على الشيفرة الخاصة بهذا المقال على GitHub.

ختاماً

يتضمن Illuminate كذلك Query Builder والذي يمكنك استخدامه لإجراء استعلامات أكثر تعقيداً، لذا يجدر بك التعرّف عليه واستخدامه في تطبيقاتك.

اﻷمر الوحيد الذي ينقص التطبيقات القائمة على قاعدة بيانات Illuminate هو خاصية تهجير قواعد البيانات database migrations، وهي خاصية مفيدة جدًّا في Laravel و Lumen وهو اﻷخ اﻷصغر لـ Laravel. لذا أنصحك باستخدام هذين اﻹطارين في تطبيقات والاستفادة من المزايا التي يقدمها كل منهما.

يمكنك الحصول على المزيد من المعلومات حول Eloquent في صفحة التوثيق الرسمي.

المصادر

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.