هيكل مجلدات مشروع Laravel 11 — وظيفة كل ملف ومجلد

هذا الدرس من أهم الدروس التي ستقرأها في هذه الدورة. كثير من الطلاب يتعلمون كيفية كتابة كود Laravel، لكنهم لا يعرفون أين يضعون هذا الكود. النتيجة: يضعون الكود في مكان خاطئ، المشروع يعمل لكنه فوضوي، وعند التعاون مع مطورين آخرين تحدث مشاكل. في هذا الدرس ستتعلم "خارطة المنزل" — أين يسكن كل شيء وما وظيفته.

1. النظرة الشاملة على هيكل مشروع Laravel

عند إنشاء مشروع Laravel جديد، ستجد هذا الهيكل في مجلد مشروعك. لا تنصدم من عدد الملفات — معظمها لن تحتاج لتعديله أبداً في البداية. ركّز على ما سنشرحه:

هيكل مشروع Laravel 11 الجديد
my-first-app/
│
├── app/                   ← 🟥 هنا تكتب معظم كودك
│   ├── Http/
│   │   ├── Controllers/   ← المتحكمات
│   │   └── Middleware/    ← طبقات الفحص
│   ├── Models/            ← نماذج قاعدة البيانات
│   └── Providers/         ← Service Providers
│
├── bootstrap/             ← إعداد التطبيق عند التشغيل (لا تعدّله)
├── config/                ← ملفات الإعداد (قاعدة بيانات، بريد، ...)
├── database/              ← 🟥 Migrations وSeeders والـ Factories
│   ├── migrations/        ← بناء جداول قاعدة البيانات
│   ├── seeders/           ← شحن بيانات تجريبية
│   └── factories/         ← توليد بيانات وهمية للاختبار
│
├── public/                ← 🟥 الوحيد المكشوف للإنترنت
│   └── index.php          ← نقطة الدخول الوحيدة
│
├── resources/             ← 🟥 الواجهات وملفات CSS/JS الأصلية
│   ├── views/             ← صفحات Blade
│   ├── css/               ← ملفات CSS قبل المعالجة
│   └── js/                ← ملفات JS قبل المعالجة
│
├── routes/                ← 🟥 تعريف روابط موقعك
│   ├── web.php            ← روابط الموقع العادي
│   └── api.php            ← روابط الـ API
│
├── storage/               ← ملفات مرفوعة، logs، cache
├── tests/                 ← اختبارات تلقائية
├── vendor/                ← مكتبات Composer (لا تعدّلها أبداً)
│
├── .env                   ← 🟥 كلمات المرور والمفاتيح السرية
├── .env.example           ← نموذج .env للمشاركة مع الفريق
├── composer.json          ← تبعيات PHP
├── package.json           ← تبعيات JavaScript (Node.js)
└── vite.config.js         ← إعداد Vite لتجميع CSS/JS
القاعدة الذهبية: المجلدات المميزة بـ 🟥 هي التي ستتعامل معها يومياً. الباقي يُعدّ مرة عند إنشاء المشروع وتتركه. Laravel يعتمد مبدأ "Convention over Configuration" — معناه أن كل شيء له مكانه المتعارف عليه، إذا احترمته سيعرف Laravel أين يجد كودك تلقائياً.

2. مجلد app/ — قلب تطبيقك

هذا هو المجلد الذي ستقضي فيه 70% من وقتك. كل منطق تطبيقك يعيش هنا. لنشرح أهم مجلداته:

app/Models/ — العلاقة مع قاعدة البيانات

كل جدول في قاعدة بياناتك له Model مقابل له هنا. Model هو الكلاس الذي يمثّل الجدول ويسمح لك بالتعامل معه بكود PHP أنيق عوضاً عن كتابة استعلامات SQL يدوياً.

app/Models/Article.php
class Article extends Model
{
    // الأعمدة التي يمكن ملؤها عبر النماذج (Forms)
    protected $fillable = ['title', 'content', 'user_id'];

    // علاقة: كل مقال ينتمي لمستخدم واحد
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

لإنشاء Model جديد بدون كتابة الكود يدوياً، استخدم Artisan:

php artisan make:model Article

app/Http/Controllers/ — المتحكمات

Controllers هي الوسيط بين الطلب (Request) وقاعدة البيانات والعرض (View). عندما يطلب مستخدم /articles، Router يوجّه الطلب لـ Controller الذي يجلب البيانات ويرسلها للعرض.

app/Http/Controllers/ArticleController.php
class ArticleController extends Controller
{
    // عرض قائمة المقالات
    public function index()
    {
        $articles = Article::latest()->paginate(10);
        return view('articles.index', compact('articles'));
    }

    // عرض مقال واحد
    public function show(Article $article)
    {
        return view('articles.show', compact('article'));
    }
}
php artisan make:controller ArticleController --resource
الخيار --resource ماذا يفعل؟
ينشئ Controller يحتوي تلقائياً على 7 دوال جاهزة تغطي العمليات الأساسية: index (قائمة)، create (نموذج إنشاء)، store (حفظ)، show (عرض واحد)، edit (نموذج تعديل)، update (تحديث)، destroy (حذف). هذا النمط يُسمى CRUD وهو أساس 90% من التطبيقات.

app/Http/Middleware/ — طبقات الفحص

شرحناها في الدرس السابق. هنا ستجد Middleware مدمجة مع لارافيل مثل Authenticate.php وهنا أيضاً ستضع Middleware تنشئها بنفسك لاحقاً.

php artisan make:middleware CheckSubscription

3. مجلد routes/ — خارطة روابط موقعك

هذا المجلد هو "دليل الهاتف" لموقعك — يربط كل رابط بالكود الذي يعالجه. في Laravel 11 ستجد بشكل أساسي ملفين:

routes/web.php — روابط الموقع العادي

كل رابط تراه في متصفحك ويُرجع صفحة HTML، يُعرَّف هنا. هذه الروابط تدعم الجلسات (Sessions) وحماية CSRF تلقائياً.

routes/web.php
use App\Http\Controllers\ArticleController;

// صفحة المقالات — يتطلب تسجيل الدخول
Route::middleware('auth')->group(function () {
    Route::resource('articles', ArticleController::class);
});

// الصفحة الرئيسية — متاحة للجميع
Route::get('/', function () {
    return view('welcome');
});

routes/api.php — روابط الـ API

عندما تبني API لتطبيق موبايل أو Single Page Application (Vue/React)، تضع روابطه هنا. هذه الروابط لا تستخدم الجلسات — تعتمد على Tokens للمصادقة. كل رابط هنا يُضاف تلقائياً قبله /api/.

routes/api.php
// هذا الرابط يعني: GET /api/articles
Route::get('/articles', [ArticleController::class, 'index']);

// مجموعة روابط محمية بـ Sanctum token
Route::middleware('auth:sanctum')->group(function () {
    Route::post('/articles', [ArticleController::class, 'store']);
});

4. مجلد database/ — بناء قاعدة البيانات بكود

هذا أحد أروع مفاهيم Laravel: لا تبني جداول قاعدة البيانات بيدك في phpMyAdmin. بدلاً من ذلك، تكتب كوداً PHP يصف شكل الجدول — وLaravel ينشئه وينظّمه تلقائياً. هذا يسمى Database Migrations.

database/migrations/ — تاريخ قاعدة بياناتك

كل Migration هو ملف PHP يصف تعديلاً على قاعدة البيانات في لحظة زمنية معينة. مثلاً: "أنشئ جدول articles يوم 2026-02-20". فائدة هذا النهج أن أي شخص في الفريق يستطيع تشغيل php artisan migrate ويحصل على نفس قاعدة البيانات تماماً.

database/migrations/2026_02_20_create_articles_table.php
return new class extends Migration
{
    public function up(): void
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();                          // عمود id تلقائي
            $table->string('title');               // عنوان المقال
            $table->longText('content');           // محتوى المقال
            $table->boolean('published')->default(false);
            $table->foreignId('user_id')->constrained(); // مفتاح خارجي
            $table->timestamps();                  // created_at و updated_at
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('articles');          // للتراجع عن التغيير
    }
};

لإنشاء Migration جديد:

php artisan make:migration create_articles_table

لتطبيق كل Migrations على قاعدة البيانات:

php artisan migrate

للتراجع عن آخر Migration مطبّق:

php artisan migrate:rollback

database/seeders/ — شحن بيانات تجريبية

Seeders تسمح لك بملء قاعدة البيانات ببيانات تجريبية بأمر واحد. مفيد جداً أثناء التطوير — بدلاً من إدخال بيانات يدوياً في كل مرة تُعيد فيها قاعدة البيانات.

php artisan db:seed

database/factories/ — توليد بيانات وهمية ذكية

Factories تعمل مع Seeders لتوليد بيانات وهمية ولكن واقعية المظهر (أسماء حقيقية، جمل منطقية). مثلاً: إنشاء 100 مستخدم وهمي لاختبار أداء الموقع تحت الضغط.

php artisan make:factory ArticleFactory --model=Article

5. مجلد resources/ — واجهاتك وتنسيقاتها

كل ما يراه المستخدم على الشاشة يأتي من هنا.

resources/views/ — صفحات Blade HTML

هنا تضع ملفات الـ HTML الخاصة بموقعك، لكن بصيغة Laravel الخاصة (Blade). الملفات تنتهي بـ .blade.php. Blade يسمح لك بوضع متغيرات PHP داخل HTML بطريقة نظيفة جداً.

resources/views/articles/index.blade.php
@extends('layouts.app')

@section('content')
    <h1>كل المقالات</h1>

    @foreach ($articles as $article)
        <div>
            <h2>{{ $article->title }}</h2>
            <p>{{ $article->content }}</p>
        </div>
    @endforeach

    {{ $articles->links() }}  {{-- ترقيم الصفحات --}}
@endsection

لاحظ أن @foreach و@extends و@section هي بناء Blade — أنيق وواضح بدون خلط PHP وHTML بطريقة الفوضوية القديمة.

resources/css/ و resources/js/

هنا تضع ملفات CSS وJavaScript الأصلية قبل المعالجة. أداة Vite تأخذها، تدمجها، تضغطها، وتضعها في مجلد public/build/ جاهزة للمتصفح.

npm run dev

هذا الأمر يشغّل Vite في وضع التطوير ويراقب التغييرات تلقائياً.

6. مجلد public/ — الواجهة المكشوفة للعالم

هذا مهم جداً من ناحية الأمان. مجلد public/ هو الوحيد الذي يستطيع أي شخص على الإنترنت الوصول إليه مباشرةً. باقي مجلدات المشروع (بما فيها app/ و.env) خارج نطاق الوصول العام.

⚠️ تنبيه أمني مهم جداً:
عند رفع موقعك على سيرفر حقيقي (Hosting)، يجب أن تشير قاعدة السيرفر (DocumentRoot) إلى مجلد public/ فقط وليس لجذر المشروع. إذا أشرت للجذر، ستكون ملفاتك السرية (بما فيها .env) مكشوفة للعالم. هذا خطأ يرتكبه كثير من المبتدئين وقد يُسبّب اختراقاً.

ماذا يوجد في public/؟

  • index.php — نقطة الدخول الوحيدة (شرحناها في الدرس السابق)
  • build/ — ملفات CSS وJS بعد معالجة Vite
  • صور، أيقونات، وأي ملف تريد أن يكون متاحاً للعموم مباشرةً

7. مجلد storage/ — التخزين الداخلي

هذا المجلد للتخزين الداخلي الذي لا يصل إليه المستخدمون مباشرةً:

  • storage/logs/ — سجلات الأخطاء. أول مكان تنظر فيه عند حدوث مشكلة.
  • storage/app/ — الملفات التي يرفعها المستخدمون (صور، وثائق). تحتاج إنشاء رابط رمزي لإتاحتها.
  • storage/framework/cache/ — ملفات الكاش لتسريع التطبيق.

لإتاحة الملفات المرفوعة في storage/app/public/ للعموم:

php artisan storage:link

هذا الأمر ينشئ رابطاً رمزياً (Symlink) من public/storagestorage/app/public.

8. ملف .env — أسرار مشروعك

هذا الملف في جذر المشروع (خارج كل المجلدات) وهو من أهم الملفات في Laravel. يحتوي على كل المعلومات الحساسة التي تختلف من بيئة لأخرى: كلمات مرور قاعدة البيانات، مفاتيح API، إعدادات البريد الإلكتروني.

.env — محتوى مبسط
APP_NAME=Laravel
APP_ENV=local          # local أو production
APP_KEY=base64:...     ← مفتاح التشفير الفريد لمشروعك
APP_DEBUG=true         # true في التطوير، false في الإنتاج ⚠️
APP_URL=http://localhost

DB_CONNECTION=sqlite   # أو mysql أو pgsql
DB_HOST=127.0.0.1
DB_DATABASE=my_database
DB_USERNAME=root
DB_PASSWORD=

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
قاعدة لا تُكسر أبداً: لا ترفع ملف .env إلى GitHub
Laravel يضيف .env تلقائياً إلى ملف .gitignore حتى لا يُرفع عن طريق الخطأ. بدلاً من ذلك، يوجد ملف .env.example يحتوي نفس المفاتيح لكن بقيم فارغة — هذا هو الذي تشاركه مع فريقك. كل مطور يملأ .env الخاص به بالقيم المناسبة لجهازه.

من أي مكان في الكود، تستطيع الوصول لقيم .env هكذا:

الوصول لقيم .env في الكود
// قراءة قيمة مباشرة
$appName = env('APP_NAME');

// قراءة من ملفات config (الأفضل)
$appName = config('app.name');
$dbConnection = config('database.default');
لماذا config() أفضل من env() مباشرةً؟
في الإنتاج، Laravel يُخزّن إعدادات الـ Config في الكاش لتسريع التحميل. إذا استخدمت env() مباشرةً في كودك، ستحصل على قيم خاطئة عند تفعيل الكاش. استخدم دائماً config() للوصول للإعدادات في الكود.

9. مجلد vendor/ وملف composer.json

مجلد vendor/

هذا المجلد ينشئه Composer تلقائياً عند تثبيت المشروع. يحتوي على كل مكتبات PHP التي يعتمد عليها Laravel (وهي مئات المكتبات من آلاف المساهمين).

قاعدة: لا تعدّل أي ملف داخل vendor/ أبداً.
أي تعديل تجريه هنا سيُحذف عند تحديث المكتبات بـ composer update. المجلد أيضاً لا يُرفع إلى GitHub — بدلاً من ذلك يرفع المطور composer.json وعند السحب ينفّذ composer install.

ملف composer.json

هذا الملف يشبه قائمة التسوق — يحدد اسم المكتبات التي يحتاجها مشروعك وإصداراتها. Composer يقرأ هذا الملف ويحمّل كل المكتبات المطلوبة.

composer install

لأول تثبيت بعد سحب مشروع من GitHub.

composer require spatie/laravel-permission

لإضافة مكتبة جديدة للمشروع (مثال: مكتبة إدارة الصلاحيات).

أسئلة شائعة عن هيكل مجلدات Laravel

أسئلة حقيقية يطرحها الطلاب عند التعامل مع هيكل مشروع Laravel لأول مرة:

الجواب: في resources/ — وليس في public/ مباشرةً.

تضع ملفاتك الأصلية في resources/css/app.css وresources/js/app.js. بعدها Vite يعالجها ويضعها تلقائياً في public/build/.

في قالب Blade، تربطها هكذا: @vite(['resources/css/app.css', 'resources/js/app.js'])

.env للقيم التي تتغيّر حسب البيئة (تطوير/إنتاج) وتحتوي أسراراً. config/ يقرأ من .env ويعيد تنظيم القيم بشكل منطقي.

مثال: .env يحتوي DB_PASSWORD=secretconfig/database.php يقرأها ويعرضها كـ config('database.connections.mysql.password'). في كودك: استخدم دائماً config() لا env() مباشرةً.

نعم، وهذا شائع جداً في المشاريع الكبيرة.

المجلدات الشائع إضافتها:

  • app/Services/ — لمنطق الأعمال المعقد (Business Logic)
  • app/Repositories/ — لفصل منطق قاعدة البيانات عن Controllers
  • app/Traits/ — لكود قابل لإعادة الاستخدام بين كلاسات
  • app/Enums/ — لتعريف قيم ثابتة (Laravel 11 يدعم PHP 8.1 Enums)

في Laravel 10 كانت هناك 4 ملفات: web.php وapi.php وconsole.php وchannels.php.

في Laravel 11 قرر الفريق تبسيط المشروع: المشروع الجديد يبدأ بملفين فقط (web.php وapi.php). يمكنك إضافة الملفات الأخرى يدوياً إذا احتجتها. التغيير مؤقتاً — يمكنك دائماً استعادة البنية القديمة.

10. ملخص — ماذا تكتب أين؟

جدول مرجعي للرجوع إليه في أي وقت:

تريد فعل ماذا؟ أين تكتب؟ أمر Artisan
إضافة رابط جديد للموقع routes/web.php
كتابة منطق معالجة الطلب app/Http/Controllers/ make:controller
إنشاء جدول في قاعدة البيانات database/migrations/ make:migration
التعامل مع جدول موجود في DB app/Models/ make:model
تصميم صفحة HTML resources/views/
كتابة CSS خاص بالموقع resources/css/app.css
تخزين ملف رفعه المستخدم storage/app/public/ storage:link
إضافة إعداد جديد (API key مثلاً) .env + config/services.php
شحن بيانات تجريبية database/seeders/ make:seeder
الدرس القادم

نظام التوجيه (Routing) — كيف تربط الروابط بالكود 🗺️

الآن تعرف أين تكتب كل شيء. الخطوة التالية هي تعلم كيف تربط روابط موقعك بالكود الذي يعالجها. الـ Routing هو الخيط الذي يربط كل أجزاء التطبيق ببعض.

تعلم نظام التوجيه
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن