recent
أخبار ساخنة

بناء المتحكمات Controllers في Laravel

Controllers – بناء المتحكمات

إنشاء 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

  1. نسيان استيراد Controller.
  2. خطأ في اسم Method.
  3. وضع Controller في مكان غير صحيح.
  4. 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، بحيث نتمكن من بناء واجهات حقيقية بدلًا من الصفحات البسيطة التي استخدمناها حتى الآن.

google-playkhamsatmostaqltradentX