إنشاء Controller وربطه بالـ Routes والـ Views
بعد أن تعرّفنا في الدرس الرابع على Routing في Laravel وكيفية إنشاء Routes والتعامل مع الروابط وRoute Parameters وNamed Routes، وصلنا الآن إلى خطوة مهمة جدًا في تعلم Laravel، وهي التعرف على Controllers.
إذا كنت قد بدأت تلاحظ أن ملف:
routes/web.php
يمكن أن يمتلئ بسرعة عندما نضع بداخله جميع الأكواد والمنطق الخاص بالتطبيق، فهذا يعني أنك وصلت إلى النقطة التي نحتاج فيها إلى Controllers.
الـ Controller هو المكان الذي نضع فيه جزءًا كبيرًا من منطق التعامل مع طلبات المستخدم، بدلًا من وضع كل شيء داخل Routes.
فعلى سبيل المثال، بدلًا من كتابة:
Route::get('/articles', function () {
// الكثير من الأكواد هنا
});
يمكننا إنشاء Controller يحتوي على دالة مخصصة للتعامل مع المقالات:
Route::get('/articles', [ArticleController::class, 'index']);
ثم نضع منطق الصفحة داخل:
app/Http/Controllers/ArticleController.php
وهذه الطريقة تجعل المشروع أكثر تنظيمًا وأسهل في التطوير والصيانة.
في هذا الدرس سنتعلم Controllers من البداية، وسنقوم بإنشاء أول Controller باستخدام Artisan، ثم نربطه بالـ Routes، ونتعلم كيفية إرسال البيانات إلى Views، وكيفية استقبال Route Parameters، بالإضافة إلى التعرف على Resource Controllers وفكرة CRUD، مع تطبيق عملي كامل يساعدك على فهم العلاقة بين Route → Controller → View.
ما هو Controller في Laravel؟
يمكن تعريف Controller بطريقة بسيطة بأنه كلاس مسؤول عن تنظيم منطق التعامل مع طلبات HTTP المتعلقة بجزء معين من التطبيق.
على سبيل المثال، إذا كان لدينا موقع يحتوي على:
- المستخدمين
- المقالات
- المنتجات
- الطلبات
- التصنيفات
فمن الطبيعي أن يكون لدينا Controllers مختلفة للتعامل مع هذه الأجزاء.
مثلًا:
UserController ArticleController ProductController OrderController CategoryController
وبدلًا من وضع جميع الأكواد داخل:
routes/web.php
نقوم بتوزيع منطق التطبيق على Controllers مناسبة.
توضح وثائق Laravel الرسمية أن Controllers تساعد على تجميع منطق التعامل مع الطلبات المرتبطة بجزء معين من التطبيق داخل Class واحد، وتوجد Controllers افتراضيًا داخل:
app/Http/Controllers
كما يمكن إنشاء Controller باستخدام أمر Artisan:
php artisan make:controller UserController
لماذا نستخدم Controllers؟
قد تسأل الآن:
لماذا لا نضع كل شيء داخل Route؟
في المشاريع الصغيرة جدًا يمكن فعل ذلك، مثل:
Route::get('/about', function () {
return 'About Us';
});
لكن تخيل أن الصفحة تحتاج إلى:
- جلب بيانات من قاعدة البيانات.
- التحقق من المستخدم.
- معالجة بعض البيانات.
- إرسال البيانات إلى View.
- التعامل مع شروط مختلفة.
- تنفيذ عمليات إضافية.
سيبدأ Route بالتحول إلى شيء طويل ومعقد.
مثلًا:
Route::get('/articles', function () {
// جلب المقالات
// معالجة البيانات
// التحقق من المستخدم
// ترتيب المقالات
// تجهيز البيانات
// إرسال البيانات إلى View
});
ومع نمو المشروع ستصبح ملفات Routes صعبة القراءة.
بدلًا من ذلك نكتب:
Route::get('/articles', [ArticleController::class, 'index']);
ثم نضع المنطق في:
public function index()
{
// منطق الصفحة هنا
}
وبذلك يصبح الـ Route مسؤولًا عن تحديد الطريق، بينما Controller مسؤول عن تنفيذ منطق الطلب.
أين توجد Controllers؟
في مشروع Laravel ستجد المجلد:
app/Http/Controllers
وهذا هو المكان الافتراضي الذي يتم فيه تخزين Controllers.
مثلًا:
app/
└── Http/
└── Controllers/
├── Controller.php
├── UserController.php
├── ArticleController.php
└── ProductController.php
قد يكون لديك في البداية Controller أساسي، ثم تبدأ بإنشاء Controllers جديدة حسب احتياجات التطبيق.
ولا يشترط أن يكون كل Controller مرتبطًا بجدول في قاعدة البيانات، ولكن من الشائع جدًا أن يكون لكل مورد أو جزء رئيسي من التطبيق Controller مناسب له.
إنشاء أول Controller
لنقم بإنشاء Controller بسيط.
افتح Terminal داخل مشروع Laravel واكتب:
php artisan make:controller PageController
سيقوم Laravel بإنشاء Controller باسم:
PageController.php
داخل:
app/Http/Controllers
أي:
app/Http/Controllers/PageController.php
ويمكنك استخدام:
php artisan make:controller PageController
لإنشاء Controllers عادية في Laravel.
شكل Controller الجديد
بعد إنشاء Controller، ستجد كلاس مشابهًا لهذا:
<?php
namespace App\Http\Controllers;
class PageController extends Controller
{
//
}
دعنا نفهم هذا الكود.
namespace
السطر:
namespace App\Http\Controllers;
يحدد Namespace الخاص بالكلاس.
وهذا يتوافق مع مكان Controller داخل المشروع:
app/Http/Controllers
class
بعد ذلك لدينا:
class PageController extends Controller
أي أننا أنشأنا Class باسم:
PageController
ويرتبط بالـ Controller الأساسي.
الدوال
يمكننا الآن إضافة Methods داخل Controller.
مثلًا:
public function home()
{
return 'Home Page';
}
فيصبح Controller:
<?php
namespace App\Http\Controllers;
class PageController extends Controller
{
public function home()
{
return 'Home Page';
}
}
الآن أصبح لدينا Controller يحتوي على Action باسم:home
ربط Controller مع Route
بعد إنشاء Controller نحتاج إلى ربطه بـ Route.
افتح:
routes/web.php
وأضف:
use App\Http\Controllers\PageController;
Route::get('/', [PageController::class, 'home']);
الآن ماذا يحدث؟
عندما يزور المستخدم:
/
سيبحث Laravel عن Route المناسب، ثم يقوم باستدعاء:
PageController
وتحديدًا الدالة:
home
أي:
PageController::home()
والنتيجة ستكون:
Home Page
وهذه هي الفكرة الأساسية التي يجب أن تفهمها في هذا الدرس:
URL ↓ Route ↓ Controller ↓ Method ↓ Response
وثائق Laravel توضح أن Route يمكن ربطه مباشرة بكلاس Controller وMethod باستخدام الصيغة:
Route::get('/user/{id}', [UserController::class, 'show']);
وعندما يصل الطلب المطابق، يتم استدعاء الـ Method مع تمرير Route Parameters إليها.
إنشاء صفحة About باستخدام Controller
لنقم بإنشاء صفحة حقيقية بدلًا من إرجاع نص فقط.
داخل:
PageController.php
أضف:
public function about()
{
return view('about');
}
ليصبح Controller:
<?php
namespace App\Http\Controllers;
class PageController extends Controller
{
public function home()
{
return 'Home Page';
}
public function about()
{
return view('about');
}
}
ثم أنشئ View داخل:
resources/views/about.blade.php
واكتب:
<!DOCTYPE html>
<html lang="ar">
<head>
<meta charset="UTF-8">
<title>من نحن</title>
</head>
<body>
<h1>من نحن</h1>
<p>مرحبًا بك في موقعنا.</p>
</body>
</html>
ثم في:
routes/web.php
أضف:
use App\Http\Controllers\PageController;
Route::get('/about', [PageController::class, 'about']);
الآن عندما تفتح:
/about
سيتم تنفيذ:
PageController::about()
ثم:
return view('about');
وبالتالي تظهر الصفحة.
Controller يمكن أن يحتوي على عدة Methods
ليس من الضروري إنشاء Controller لكل صفحة.
يمكن أن يحتوي Controller الواحد على عدة Methods مرتبطة بنفس الجزء من التطبيق.
مثلًا:
class PageController extends Controller
{
public function home()
{
return view('home');
}
public function about()
{
return view('about');
}
public function contact()
{
return view('contact');
}
}
ثم Routes:
Route::get('/', [PageController::class, 'home']);
Route::get('/about', [PageController::class, 'about']);
Route::get('/contact', [PageController::class, 'contact']);
وهكذا أصبح لدينا Controller مسؤول عن الصفحات العامة للموقع.
لكن يجب الانتباه إلى عدم وضع عدد ضخم من العمليات غير المرتبطة داخل Controller واحد؛ الأفضل أن يبقى كل Controller مركزًا على جزء واضح من التطبيق.
تمرير البيانات من Controller إلى View
من أهم استخدامات Controllers تمرير البيانات إلى Views.
لنفترض أننا نريد عرض اسم الموقع.
داخل Controller:
public function home()
{
$siteName = 'نسور التقنية';
return view('home', [
'siteName' => $siteName
]);
}
ثم داخل:
resources/views/home.blade.php
يمكننا كتابة:
<h1>مرحبًا بك في {{ $siteName }}</h1>
عند فتح الصفحة سيظهر:
مرحبًا بك في نسور التقنية
يمكنك أيضًا إرسال عدة متغيرات:
public function home()
{
$siteName = 'نسور التقنية';
$year = 2026;
return view('home', [
'siteName' => $siteName,
'year' => $year
]);
}
ثم في Blade:
<h1>{{ $siteName }}</h1>
<p>السنة الحالية: {{ $year }}</p>
وهكذا يصبح Controller هو المسؤول عن تجهيز البيانات، بينما View مسؤولة عن عرضها.
تمرير البيانات باستخدام compact
يمكنك أيضًا استخدام compact():
public function home()
{
$siteName = 'نسور التقنية';
$year = 2026;
return view('home', compact('siteName', 'year'));
}
وهذا يعادل تقريبًا:
return view('home', [
'siteName' => $siteName,
'year' => $year
]);
كلا الأسلوبين صالح، واختيارك يعتمد على أسلوبك في كتابة الكود.
Route Parameters مع Controller
في الدرس السابق تعلمنا Route Parameters.
والآن يمكننا استخدامها مع Controllers.
لنفترض أن لدينا:
Route::get('/articles/{id}', [ArticleController::class, 'show']);
وعند إنشاء Controller:
php artisan make:controller ArticleController
يمكننا كتابة:
public function show($id)
{
return 'Article ID: ' . $id;
}
الآن إذا فتح المستخدم:
/articles/10
سيصل الرقم:
10
إلى:
$id
وبالتالي تكون النتيجة:
Article ID: 10
وإذا فتح:
/articles/25
ستصبح:
Article ID: 25
هذه الطريقة مهمة جدًا لأنها تسمح لنا ببناء صفحات ديناميكية.
استخدام Type Hint مع Parameters
يمكنك تحديد نوع Parameter في PHP:
public function show(int $id)
{
return 'Article ID: ' . $id;
}
وهذا يجعل الكود أكثر وضوحًا من ناحية النوع المتوقع للمتغير.
لكن في المشاريع الواقعية، عندما نبدأ باستخدام Eloquent، سننتقل غالبًا إلى طريقة أقوى وهي Route Model Binding.
Route Model Binding داخل Controller
عندما نصل إلى Eloquent Models، يمكننا الاستفادة من Route Model Binding.
مثلًا إذا كان لدينا Model باسم:
Post
يمكننا كتابة:
use App\Models\Post;
public function show(Post $post)
{
return view('posts.show', [
'post' => $post
]);
}
ومع Route:
Route::get('/posts/{post}', [PostController::class, 'show']);
يستطيع Laravel حل الـ Model المناسب تلقائيًا بناءً على Route Parameter.
وهذا يقلل الحاجة إلى كتابة عمليات البحث يدويًا داخل Controller.
هذه الميزة جزء مهم من طريقة عمل Laravel مع Eloquent، وسنتوسع فيها عندما نصل إلى درس Models وEloquent.
Controllers وHTTP Methods
يمكن لـ Controller التعامل مع أنواع مختلفة من HTTP Requests.
مثلًا لدينا:
Route::get('/articles', [ArticleController::class, 'index']);
Route::post('/articles', [ArticleController::class, 'store']);
Route::put('/articles/{article}', [ArticleController::class, 'update']);
Route::delete('/articles/{article}', [ArticleController::class, 'destroy']);
وبالتالي يمكن أن يكون لدينا:
public function index()
{
//
}
و:
public function store()
{
//
}
و:
public function update($article)
{
//
}
و:
public function destroy($article)
{
//
}
هذا التنظيم يجعل الكود واضحًا جدًا.
فالـ Route يحدد نوع الطلب والعنوان، والـ Controller Method يتولى تنفيذ العملية.
فهم أسماء Methods الشائعة
عندما تبدأ في بناء تطبيقات Laravel ستلاحظ أسماء Methods متكررة داخل Controllers.
أشهرها:
index
عادةً لعرض قائمة من العناصر.
public function index()
{
//
}
مثال:
/articles
create
عادةً لعرض نموذج إنشاء عنصر جديد.
public function create()
{
//
}
مثل:
/articles/create
store
لحفظ عنصر جديد.
public function store()
{
//
}
show
لعرض عنصر واحد.
public function show($article)
{
//
}
edit
لعرض نموذج تعديل عنصر.
public function edit($article)
{
//
}
update
لتحديث العنصر.
public function update($article)
{
//
}destroy
لحذف العنصر.
public function destroy($article)
{
//
}
هذه الأسماء ليست مجرد عادات عشوائية، بل ترتبط بشكل مباشر بفكرة Resource Controllers التي سنشرحها بعد قليل.
ما هو Resource Controller؟
عندما يكون لديك مورد Resource مثل:
articles products users orders
غالبًا ستحتاج إلى مجموعة متكررة من العمليات:
- عرض القائمة.
- عرض نموذج الإنشاء.
- إنشاء عنصر.
- عرض عنصر.
- عرض نموذج التعديل.
- تحديث عنصر.
- حذف عنصر.
Laravel توفر لك طريقة لإنشاء Controller مخصص لهذا النوع من العمليات باستخدام:
php artisan make:controller ArticleController --resource
سيقوم Laravel بإنشاء Controller يحتوي على Methods الأساسية الخاصة بعمليات CRUD.
وتوضح وثائق Laravel 13 أن خيار --resource ينشئ Controller يحتوي على Methods الخاصة بالعمليات المعتادة للمورد، ويمكن ربطه باستخدام Route::resource().
إنشاء Resource Controller
نفذ:
php artisan make:controller ArticleController --resource
سيتم إنشاء:
app/Http/Controllers/ArticleController.php
وبداخله Methods مثل:
index() create() store() show() edit() update() destroy()
بعد ذلك يمكننا تعريف Resource Route:
use App\Http\Controllers\ArticleController;
Route::resource('articles', ArticleController::class);
وبهذا السطر الواحد يقوم Laravel بإنشاء مجموعة Routes مرتبطة بالـ Controller.
مثال عملي على ArticleController
لنفترض أننا أنشأنا:
php artisan make:controller ArticleController --resource
يمكن أن نبدأ بتنظيم Controller بهذا الشكل:
<?php
namespace App\Http\Controllers;
class ArticleController extends Controller
{
public function index()
{
return view('articles.index');
}
public function create()
{
return view('articles.create');
}
public function store()
{
return 'Store Article';
}
public function show($article)
{
return 'Show Article: ' . $article;
}
public function edit($article)
{
return view('articles.edit', [
'article' => $article
]);
}
public function update($article)
{
return 'Update Article: ' . $article;
}
public function destroy($article)
{
return 'Delete Article: ' . $article;
}
}
في البداية لا تقلق بشأن حفظ البيانات في قاعدة البيانات.
هدفنا الآن هو فهم العلاقة بين:
Resource Route ↓ Controller ↓ Method ↓ View / Response
سنبدأ بالتعامل مع قاعدة البيانات وEloquent في دروس لاحقة.
Single Action Controller
في بعض الحالات قد يكون لديك Controller مسؤول عن عملية واحدة فقط.
مثلًا:
SendNewsletterController
يمكنك إنشاء Controller من هذا النوع باستخدام:
php artisan make:controller SendNewsletterController --invokable
وسيحتوي على Method باسم:
__invoke()
مثل:
<?php
namespace App\Http\Controllers;
class SendNewsletterController extends Controller
{
public function __invoke()
{
return 'Newsletter Sent';
}
}
ثم يمكنك ربطه بالـ Route مباشرة:
use App\Http\Controllers\SendNewsletterController;
Route::post('/newsletter', SendNewsletterController::class);
في هذه الحالة لا تحتاج إلى كتابة اسم Method في Route لأن Laravel ستستخدم __invoke().
هذا الأسلوب مفيد عندما تكون العملية كبيرة أو مستقلة وتريد أن يكون لها Controller خاص بها. وتدعم Laravel 13 إنشاء هذا النوع باستخدام --invokable.
Controllers وMiddleware
عندما تبدأ في التعامل مع تسجيل الدخول والصلاحيات، ستحتاج إلى Middleware.
يمكن ربط Middleware مباشرة بالـ Route:
Route::get('/profile', [UserController::class, 'show'])
->middleware('auth');
أي أن Route لن يصل إلى Controller بالطريقة نفسها إلا بعد مرور الطلب عبر Middleware المطلوب.
كما توفر Laravel 13 طرقًا لتعريف Middleware على مستوى Controller أو Methods، بما في ذلك استخدام PHP Attributes.
لكن لا نحتاج إلى التعمق في Middleware الآن؛ سيكون له درس مستقل لاحقًا.
كيف تفكر في Controller؟
من المهم أن تتوقف قليلًا عن التفكير في Controller على أنه مجرد ملف يحتوي على Functions.
الأفضل أن تفكر فيه كطبقة تنظم التعامل مع طلب المستخدم.
مثلًا عندما يطلب المستخدم:
/articles/10
يمكن أن يحدث التالي:
المستخدم ↓ URL ↓ Route ↓ ArticleController ↓ show() ↓ Article Model ↓ Database ↓ View ↓ Response
في البداية قد لا نستخدم Model أو Database، لكن عندما نصل إلى هذه المرحلة سيكون لديك تصور واضح عن مكان كل جزء من الكود.
مثال عملي كامل عن Controllers في Laravel
لنقم الآن بإنشاء مثال صغير لموقع مقالات.
الخطوة الأولى: إنشاء Controller
نفذ:
php artisan make:controller ArticleController
الخطوة الثانية: إنشاء Method
افتح:
app/Http/Controllers/ArticleController.php
واكتب:
<?php
namespace App\Http\Controllers;
class ArticleController extends Controller
{
public function index()
{
$title = 'جميع المقالات';
return view('articles.index', [
'title' => $title
]);
}
public function show($id)
{
return view('articles.show', [
'id' => $id
]);
}
}
الخطوة الثالثة: إنشاء Routes
في:
routes/web.php
اكتب:
use App\Http\Controllers\ArticleController;
Route::get('/articles', [ArticleController::class, 'index'])
->name('articles.index');
Route::get('/articles/{id}', [ArticleController::class, 'show'])
->name('articles.show');
الخطوة الرابعة: إنشاء View للقائمة
أنشئ:
resources/views/articles/index.blade.php
واكتب:
<h1>{{ $title }}</h1>
<p>مرحبًا بك في قسم المقالات.</p>
<a href="{{ route('articles.show', ['id' => 1]) }}">
عرض المقال الأول
</a>
الخطوة الخامسة: إنشاء View للمقال
أنشئ:
resources/views/articles/show.blade.php
واكتب:
<h1>المقال رقم {{ $id }}</h1>
<p>هذه صفحة المقال.</p>
<a href="{{ route('articles.index') }}">
العودة إلى المقالات
</a>
الآن افتح:
/articles
ستظهر قائمة المقالات.
وعند الضغط على:
عرض المقال الأول
سيتم الانتقال إلى:
/articles/1
ويصل الرقم 1 إلى:
show($id)
ثم يقوم Controller بإرسال الرقم إلى View.
هكذا أصبحت لديك دورة كاملة:
Route ↓ Controller ↓ Method ↓ Data ↓ View
أخطاء شائعة عند التعامل مع Controllers
- نسيان استيراد Controller.
- خطأ في اسم Method.
- وضع Controller في مكان غير صحيح.
- Controller ضخم جدًا.
نسيان استيراد Controller
إذا كتبت:
Route::get('/about', [PageController::class, 'about']);
تأكد من وجود:
use App\Http\Controllers\PageController;
في ملف Routes.
خطأ في اسم Method
إذا كتبت:
Route::get('/about', [PageController::class, 'about']);
فيجب أن تكون هناك Method باسم:
public function about()
وليس:
public function About()
أو:
public function aboutPage()
إلا إذا غيرت اسم Method في Route أيضًا.
وضع Controller في مكان غير صحيح
المكان الافتراضي هو:
app/Http/Controllers
إذا كنت مبتدئًا، لا تقم بتغيير هيكل Controllers دون سبب واضح.
Controller ضخم جدًا
من الأخطاء الشائعة وضع عشرات العمليات المختلفة داخل Controller واحد.
مثلًا:
UserController
يحتوي على:
- المستخدمين
- المنتجات
- الطلبات
- المقالات
- التقارير
- الإعدادات
هذا يجعل Controller صعب الصيانة.
الأفضل تقسيمه حسب مسؤولية واضحة.
أفضل الممارسات عند كتابة Controllers
- اجعل Controller واضح المسؤولية
- لا تضع HTML داخل Controller
- لا تجعل Controller مكانًا لكل شيء
- استخدم أسماء واضحة
- استفد من Resource Controllers
اجعل Controller واضح المسؤولية
إذا كان Controller خاصًا بالمقالات، اجعله يتعامل مع المقالات.
لا تضع HTML داخل Controller
بدلًا من:
return '<h1>Hello</h1>';
استخدم View:
return view('home');
لا تجعل Controller مكانًا لكل شيء
عندما يكبر المشروع ستتعرف على Models وServices وForm Requests وPolicies وغيرها.
ليس الهدف أن نضع كل منطق التطبيق داخل Controller.
استخدم أسماء واضحة
استخدم:
ArticleController UserController ProductController
بدلًا من أسماء غامضة مثل:
MainController DataController MyController
استفد من Resource Controllers
عندما يكون لديك مورد واضح مثل:
articles products users
يمكن أن يكون Resource Controller مناسبًا جدًا.
تمرين عملي
حان الآن دورك لتطبيق ما تعلمته.
أنشئ Controller باسم:
ProductController
باستخدام:
php artisan make:controller ProductController
ثم أضف Methods التالية:
index()
لعرض قائمة المنتجات.
و:
show($id)
لعرض منتج معين.
ثم أنشئ Routes:
/products
/products/{id}
واجعل لكل Route اسمًا مناسبًا:
products.index products.show
بعد ذلك أنشئ View باسم:
resources/views/products/index.blade.php
واعرض فيها:
قائمة المنتجات
ثم أنشئ:
resources/views/products/show.blade.php
واعرض فيها رقم المنتج.
وأخيرًا نفذ:
php artisan route:list
وتأكد من أن Routes مرتبطة بالـ Controller الصحيح.
الفرق بين Route وController وView
حتى لا تختلط عليك الأدوار، تذكر هذا الجدول:
| الجزء | وظيفته |
|---|---|
| Route | تحديد الرابط والطلب الذي سيتم التعامل معه |
| Controller | تنفيذ منطق التعامل مع الطلب |
| Model | التعامل مع البيانات وقاعدة البيانات |
| View | عرض النتيجة للمستخدم |
مثال:
/articles/10
يصل إلى:
Route
ثم:
ArticleController@show
ثم يمكن للـ Controller طلب بيانات من:
Article Model
ثم إرسال البيانات إلى:
articles.show
وأخيرًا تظهر النتيجة للمستخدم.
هذا الفصل بين المسؤوليات هو أحد الأسباب التي تجعل Laravel منظمًا وسهل التوسع.
في هذا الدرس تعرفنا على Controllers في Laravel، وتعلمنا لماذا نحتاج إليها وكيف تساعدنا على تنظيم منطق التطبيق بدلًا من وضع جميع الأكواد داخل ملفات Routes.
تعلمنا كيفية إنشاء Controller باستخدام:
php artisan make:controller PageController
وتعرفنا على مكان تخزين Controllers:
app/Http/Controllers
ثم أنشأنا Methods داخل Controller وربطناها بالـ Routes باستخدام:
Route::get('/about', [PageController::class, 'about']);
كما تعلمنا كيفية تمرير البيانات من Controller إلى Blade View، وكيفية استقبال Route Parameters، وكيفية التعامل مع Controller Methods المختلفة.
بعد ذلك تعرفنا على Resource Controllers وكيف يمكن إنشاء Controller مخصص لعمليات CRUD باستخدام:
php artisan make:controller ArticleController --resource
وتعرفنا على:
index create store show edit update destroy
بالإضافة إلى فهم فكرة Single Action Controllers باستخدام __invoke().
كما تعرفنا بشكل أولي على العلاقة بين Controllers وMiddleware، ولماذا من الأفضل أن يكون لكل Controller مسؤولية واضحة بدلًا من إنشاء Controller ضخم يحتوي على كل شيء.
والآن أصبحت لديك صورة أوضح عن بداية دورة الطلب داخل Laravel:
المستخدم ↓ URL ↓ Route ↓ Controller ↓ Model ↓ View ↓ Response
في الدرس القادم سننتقل إلى جزء مهم جدًا من Laravel وهو Blade Templates وViews، وسنتعلم كيفية بناء صفحات ديناميكية باستخدام Blade، والمتغيرات، والشروط، والحلقات، وLayouts، وComponents، بحيث نتمكن من بناء واجهات حقيقية بدلًا من الصفحات البسيطة التي استخدمناها حتى الآن.
