codeteklab

ميزات Laravel 11 التي ستغير طريقة كتابتك للكود: شرح شامل بالأمثلة

Ad
ميزات Laravel 11 التي ستغير طريقة كتابتك للكود: شرح شامل بالأمثلة

ميزات Laravel 11 التي ستغير طريقة كتابتك للكود: شرح شامل بالأمثلة

الكاتب : hamza ougjjou

نشر في : 17-02-2026

التصنيفات :

laravel

يقدم هذا المقال شرحاً مبسطاً وواضحاً لأهم الميزات الجديدة في Laravel 11، وكيف تساعد المطورين في كتابة كود أنظف، أسرع، وأبسط. ستتعرف على الهيكل الرشيق الجديد، طريقة تنظيم الإعدادات، التحميل التلقائي للعلاقات، والتحسينات التي تجعل تجربة تطوير Laravel أقوى من أي وقت مضى — مع أمثلة عملية توضح كل نقطة.
Ad

ميزات Laravel 11 التي ستغير طريقة كتابتك للكود: شرح بالأمثلة

شرح ميزات لارافيل 11 (Laravel 11)

مع كل إصدار رئيسي، لا يقوم فريق لارافيل بإضافة ميزات جديدة فحسب، بل يقوم "بإعادة التفكير" (re-imagining) في "تجربة المطور" (Developer Experience) بأكملها. إصدار Laravel 11 (الصادر في مارس 2024) ليس استثناءً، بل هو "القفزة" الأكبر نحو "البساطة" (Minimalism) و "الرشاقة" (Slimming Down) منذ سنوات.

إذا كنت معتاداً على هيكل Laravel 5 أو 8، فإن "أول" ما ستلاحظه عند إنشاء مشروع Laravel 11 هو: "أين ذهبت كل الملفات؟".

هذا الإصدار يتبنى فلسفة "الحد الأدنى افتراضياً" (Minimalist by default). بدلاً من إعطائك "كل شيء" (بما في ذلك ملفات API و Channels التي قد لا تستخدمها أبداً)، فإنه يبدأ "صغيراً" (slim)، ويمنحك "الأدوات" (artisan commands) لإضافة الأجزاء التي تحتاجها "فقط".

في هذا الدليل المفصل، سنغوص في "أهم" التغييرات الهندسية والفلسفية في Laravel 11، وكيف ستؤثر هذه التغييرات بشكل إيجابي على إنتاجيتك وجودة الكود الخاص بك. الفصل الأول: "الهيكل الرشيق" (Slim Application Skeleton)

هذا هو التغيير "الأكبر" والأكثر وضوحاً. لنلق نظرة على "قبل" و "بعد".

"قبل" (Laravel 10):

مجلد /routes كان يحتوي على 4 ملفات افتراضياً:

  • web.php (للمسارات العادية)
  • api.php (لمسارات الـ API، مع middleware و prefix جاهز)
  • console.php (لأوامر Artisan)
  • channels.php (لمسارات بث WebSockets)

مجلد /app/Http/Middleware كان يحتوي على "9" ملفات middleware افتراضية (مثل `Authenticate`, `EncryptCookies`, `VerifyCsrfToken`، إلخ). ومجلد /config كان يحتوي على "12" ملف إعدادات (config) ضخم.

"بعد" (Laravel 11):

مجلد /routes يحتوي الآن على ملفين "فقط":

  • web.php
  • console.php

أين ذهبت `api.php` و `channels.php`؟

لقد "اختفت" (افتراضياً). فلسفة Laravel 11 هي: "إذا كنت لا تبني API، لماذا تحتاج ملف `api.php`؟".

كيف "نستعيدها" إذا احتجناها؟ ببساطة، عبر أوامر Artisan الجديدة:


# هذا الأمر "ينشئ" ملف `routes/api.php`
# و "يشغل" (registers) الـ middleware الخاص بالـ API تلقائياً
php artisan install:api

# هذا الأمر "ينشئ" ملف `routes/channels.php`
# و "يشغل" (registers) إعدادات الـ Broadcasting
php artisan install:broadcasting
        

هذا المبدأ "ينطبق" أيضاً على `WebSocket broadcasting` (باستخدام Laravel Reverb) وحتى `Health Checks`. أنت "تختار" (Opt-in) الميزات، بدلاً من "إلغاء" (Opt-out) تفعيلها.

الفصل الثاني: "تطور" ملفات الإعدادات (Config Files)

"أين ذهب مجلد /config؟"

هو "لم يختفِ" تماماً، ولكنه "أصبح شبه فارغ". في Laravel 11، تم "نقل" (moved) "كل" الإعدادات (أكثر من 900 سطر!) من "ملفات" (files) في مجلد /config إلى "داخل" إطار العمل (Framework) نفسه.

ملف config/app.php (الأضخم سابقاً) "اختفى" تماماً.

كيف "أغير" الإعدادات إذن؟

عبر ملف bootstrap/app.php الجديد. هذا الملف أصبح "لوحة التحكم" المركزية لتطبيقك.

نموذج "التتالي" (Cascade) الجديد

الإعدادات الآن "تتتالى" (cascade) من "قلب" (Core) إطار العمل. "لا يتم" تحميل ملفات /config "إلا" إذا كنت تريد "تجاوز" (Override) القيمة الافتراضية.

مثال: تريد "تغيير" الـ Timezone (الذي كان في `config/app.php`):


// bootstrap/app.php

use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        console: __DIR__.'/../routes/console.php',
        
        // "هنا" (أو في ملف .env)
        // هذا "يتجاوز" القيمة الافتراضية داخل إطار العمل
        using: function (Router $router) {
            config(['app.timezone' => 'Africa/Algiers']);
        }
    )
    ->withMiddleware(function (Middleware $middleware) {
        // ...
    })
    ->withExceptions(function (Exceptions $exceptions) {
        // ...
    })->create();
        

النتيجة: مجلد /config نظيف جداً، ويحتوي "فقط" على "التغييرات" التي قمت بها، وليس "نسخة كاملة" (full copy) من إعدادات إطار العمل.

الفصل الثالث: "التحميل التلقائي" (Eager Loading) الافتراضي

هذا "تغيير هائل" (Huge Change) "لصالح الأداء" (Performance-first) ويحل "أكبر" مشكلة يقع فيها المطورون: مشكلة N+1 Query.

المشكلة (قبل Laravel 11):

تخيل أن لديك 100 "مقال" (Post)، وكل مقال "ينتمي إلى" (belongsTo) "مستخدم" (User).


// "سيء" (N+1 Problem)
// Controller:
$posts = Post::all(); // <-- 1 استعلام (Query) لجلب 100 مقال

// Blade View (inside a @foreach loop):
foreach ($posts as $post) {
    // "الكارثة": هذا "ينفذ" 100 استعلام إضافي!
    // (استعلام واحد لكل مستخدم)
    echo $post->user->name;
}
// المجموع: 101 استعلام (بطيء جداً)
        

الحل (القديم): كان يجب عليك "أنت" (المطور) أن "تتذكر" (remember) "دائماً" استخدام "التحميل المسبق" (Eager Loading):


// "جيد" (الحل اليدوي)
$posts = Post::with('user')->get(); // <-- 2 استعلام فقط (مهما كان عدد المقالات)
        

الحل (Laravel 11+): "التحميل التلقائي"

لارافيل 11 "يفترض" (assumes) أنك "ستحتاج" (will need) هذه العلاقة، ويقوم بـ "تحميلها مسبقاً" (eager loads it) "تلقائياً" (automatically).

في نموذج User.php، يمكنك الآن تحديد "العلاقات" التي يجب تحميلها "افتراضياً":


// app/Models/Post.php

class Post extends Model
{
    // ...
    
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
    
    /**
     * "الميزة الجديدة": تحديد العلاقات لتحميلها افتراضياً
     */
    protected function casts(): array
    {
        return [
            // ...
        ];
    }

    /**
     * "الميزة الجديدة": تحديد العلاقات لتحميلها افتراضياً
     */
    public function newQuery()
    {
        // "أخبر" لارافيل أن يقوم "دائماً" بـ `with('user')`
        return parent::newQuery()->with('user');
    }
    
    // (هناك طريقة أحدث باستخدام `$with` property أيضاً)
    // protected $with = ['user'];
}
        

النتيجة: الآن، حتى لو "نسي" المطور وكتب Post::all()، فإن لارافيل "سيحميه" (protects him) من نفسه، وسينفذ Post::with('user')->get() "خلف الكواليس" (under the hood). هذا "أداء افتراضي" (Performance by default).

الفصل الرابع: ميزات "نوعية" (Quality-of-Life)

1. مسار "فحص الصحة" (Health Check Route)

أصبح هناك مسار /up "مدمج" (Built-in). هذا المسار "حيوي" (Critical) لخدمات "مراقبة" (Monitoring) الخادم (مثل Pingdom) أو "منسقات" (Orchestrators) مثل Kubernetes.

هو "يطلق حدثاً" (fires an event) يسمى DiagnosingHealth، مما يتيح لك "التحقق" (check) من أن "قاعدة البيانات" (DB) و "الكاش" (Cache) يعملان قبل إرجاع "200 OK". هذا "أكثر احترافية" من مجرد التحقق أن الخادم "موجود".

2. "تحديد المعدل" (Rate Limiting) بالثانية

في الماضي، كان "الحد الأدنى" (Minimum) لتحديد المعدل هو "الدقيقة" (per-minute).


// "قديم" (Laravel 10)
RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60); // 60 في الدقيقة
});
        

المشكلة: هذا "يسمح" (allows) للمهاجم بإرسال "60 طلب دفعة واحدة" (Burst) في "الثانية الأولى"، ثم "ينتظر" (waits).

الحل (Laravel 11): "تحديد" (Granularity) "أدق" (finer).


// "حديث" (Laravel 11)
RateLimiter::for('api', function (Request $request) {
    // "طلب واحد في الثانية" (أكثر أماناً)
    return Limit::perSecond(1);
});
        

3. أوامر `make` جديدة

لإكمال "تجربة المطور" (DX) الحديثة، تمت إضافة أوامر Artisan التي طال انتظارها:


php artisan make:enum
php artisan make:interface
php artisan make:trait
        

هذا "يوفر الوقت" (saves time) ويشجع المطورين على "استخدام" (using) هذه المفاهيم الهندسية (Enums, Interfaces) التي "تدعمها" PHP 8+ بقوة.

الخاتمة: "النضج" (Maturity)

Laravel 11 هو "إصدار النضج". هو "لا يضيف" (doesn't add) ميزات "براقة" (shiny) بقدر ما "ينظف" (cleans up) و "يصقل" (polishes) الكود الذي "نكتبه يومياً".

بتبني "فلسفة الحد الأدنى" (Minimalist Philosophy)، هو "يجبر" المطور (بشكل لطيف) على "التفكير" (think) في "بنية" (Architecture) تطبيقه. هل هو "تطبيق ويب" (Web App)؟ أم "API"؟ أم "WebSocket Server"؟ هذا "التركيز" (Focus)، مقترناً بـ "الأداء الافتراضي" (Default Performance) (مثل Eager Loading)، يجعل Laravel 11 "أسرع" (faster) و "أبسط" (simpler) و "أكثر متعة" (more joyful) في الاستخدام من أي وقت مضى.

التعليقات

لا يوجد تعليقات على المقال حتى الان

Ad
Ad