هيكل مجلدات مشروع Laravel 11 — وظيفة كل ملف ومجلد
1. النظرة الشاملة على هيكل مشروع Laravel
عند إنشاء مشروع Laravel جديد، ستجد هذا الهيكل في مجلد مشروعك. لا تنصدم من عدد الملفات — معظمها لن تحتاج لتعديله أبداً في البداية. ركّز على ما سنشرحه:
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
2. مجلد app/ — قلب تطبيقك
هذا هو المجلد الذي ستقضي فيه 70% من وقتك. كل منطق تطبيقك يعيش هنا. لنشرح أهم مجلداته:
app/Models/ — العلاقة مع قاعدة البيانات
كل جدول في قاعدة بياناتك له Model مقابل له هنا. Model هو الكلاس الذي يمثّل الجدول ويسمح لك بالتعامل معه بكود PHP أنيق عوضاً عن كتابة استعلامات SQL يدوياً.
class Article extends Model
{
// الأعمدة التي يمكن ملؤها عبر النماذج (Forms)
protected $fillable = ['title', 'content', 'user_id'];
// علاقة: كل مقال ينتمي لمستخدم واحد
public function user()
{
return $this->belongsTo(User::class);
}
}
لإنشاء Model جديد بدون كتابة الكود يدوياً، استخدم Artisan:
app/Http/Controllers/ — المتحكمات
Controllers هي الوسيط بين الطلب (Request) وقاعدة البيانات والعرض (View).
عندما يطلب مستخدم /articles، Router يوجّه الطلب لـ Controller
الذي يجلب البيانات ويرسلها للعرض.
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'));
}
}
--resource ماذا يفعل؟ينشئ Controller يحتوي تلقائياً على 7 دوال جاهزة تغطي العمليات الأساسية:
index (قائمة)، create (نموذج إنشاء)، store (حفظ)،
show (عرض واحد)، edit (نموذج تعديل)،
update (تحديث)، destroy (حذف).
هذا النمط يُسمى CRUD وهو أساس 90% من التطبيقات.
app/Http/Middleware/ — طبقات الفحص
شرحناها في الدرس السابق. هنا ستجد Middleware مدمجة مع لارافيل مثل Authenticate.php
وهنا أيضاً ستضع Middleware تنشئها بنفسك لاحقاً.
3. مجلد routes/ — خارطة روابط موقعك
هذا المجلد هو "دليل الهاتف" لموقعك — يربط كل رابط بالكود الذي يعالجه. في Laravel 11 ستجد بشكل أساسي ملفين:
routes/web.php — روابط الموقع العادي
كل رابط تراه في متصفحك ويُرجع صفحة HTML، يُعرَّف هنا. هذه الروابط تدعم الجلسات (Sessions) وحماية CSRF تلقائياً.
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/.
// هذا الرابط يعني: 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 ويحصل على نفس قاعدة البيانات تماماً.
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 جديد:
لتطبيق كل Migrations على قاعدة البيانات:
للتراجع عن آخر Migration مطبّق:
database/seeders/ — شحن بيانات تجريبية
Seeders تسمح لك بملء قاعدة البيانات ببيانات تجريبية بأمر واحد. مفيد جداً أثناء التطوير — بدلاً من إدخال بيانات يدوياً في كل مرة تُعيد فيها قاعدة البيانات.
database/factories/ — توليد بيانات وهمية ذكية
Factories تعمل مع Seeders لتوليد بيانات وهمية ولكن واقعية المظهر (أسماء حقيقية، جمل منطقية). مثلاً: إنشاء 100 مستخدم وهمي لاختبار أداء الموقع تحت الضغط.
5. مجلد resources/ — واجهاتك وتنسيقاتها
كل ما يراه المستخدم على الشاشة يأتي من هنا.
resources/views/ — صفحات Blade HTML
هنا تضع ملفات الـ HTML الخاصة بموقعك، لكن بصيغة Laravel الخاصة (Blade).
الملفات تنتهي بـ .blade.php.
Blade يسمح لك بوضع متغيرات PHP داخل HTML بطريقة نظيفة جداً.
@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/ جاهزة للمتصفح.
هذا الأمر يشغّل 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/ للعموم:
هذا الأمر ينشئ رابطاً رمزياً (Symlink) من public/storage → storage/app/public.
8. ملف .env — أسرار مشروعك
هذا الملف في جذر المشروع (خارج كل المجلدات) وهو من أهم الملفات في Laravel. يحتوي على كل المعلومات الحساسة التي تختلف من بيئة لأخرى: كلمات مرور قاعدة البيانات، مفاتيح API، إعدادات البريد الإلكتروني.
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 إلى GitHubLaravel يضيف
.env تلقائياً إلى ملف .gitignore حتى لا يُرفع عن طريق الخطأ.
بدلاً من ذلك، يوجد ملف .env.example يحتوي نفس المفاتيح لكن بقيم فارغة — هذا هو الذي تشاركه مع فريقك.
كل مطور يملأ .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 يقرأ هذا الملف ويحمّل كل المكتبات المطلوبة.
لأول تثبيت بعد سحب مشروع من GitHub.
لإضافة مكتبة جديدة للمشروع (مثال: مكتبة إدارة الصلاحيات).
أسئلة شائعة عن هيكل مجلدات 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=secret
← config/database.php يقرأها ويعرضها كـ config('database.connections.mysql.password').
في كودك: استخدم دائماً config() لا env() مباشرةً.
نعم، وهذا شائع جداً في المشاريع الكبيرة.
المجلدات الشائع إضافتها:
app/Services/— لمنطق الأعمال المعقد (Business Logic)app/Repositories/— لفصل منطق قاعدة البيانات عن Controllersapp/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 هو الخيط الذي يربط كل أجزاء التطبيق ببعض.
تعلم نظام التوجيه