مقدمة في Laravel: أقوى إطار عمل PHP الحديث
دليل تخصصي من علاء عامر – مطور ومصمم مواقع وتطبيقات محترف
Laravel هو الخيار الأول لمطوري PHP حول العالم. يجمع بين البساطة والقوة ليوفر تجربة تطوير استثنائية.
1️⃣ لماذا Laravel هو الخيار الأمثل؟
| الميزة | الوصف | الفائدة |
|---|---|---|
| Eloquent ORM | نظام إدارة قواعد البيانات المتطور | كتابة استعلامات أسهل وأكثر أماناً |
| Artisan CLI | أداة سطر الأوامر المدمجة | إنتاجية أعلى وتطوير أسرع |
| Blade Template | محرك القوالب القوي | فصل منطق البرمجة عن التصميم |
| Security Features | أمان مدمج متقدم | حماية من الثغرات الشائعة |
تثبيت Laravel باستخدام Composer:
# إنشاء مشروع Laravel جديد
composer create-project laravel/laravel my-project
# الانتقال لمجلد المشروع
cd my-project
# تشغيل الخادم المحلي
php artisan serve
هيكل مجلدات Laravel الأساسي:
my-project/
├── app/ # منطق التطبيق الرئيسي
│ ├── Http/ # Controllers & Middleware
│ ├── Models/ # نماذج البيانات
│ └── Providers/ # Service Providers
├── config/ # ملفات التكوين
├── database/ # Migrations & Seeders
├── public/ # الملفات العامة
├── resources/ # Views & Assets
├── routes/ # تعريف المسارات
└── storage/ # التخزين المحلي
2️⃣ المفاهيم الأساسية في Laravel
نمط MVC (Model-View-Controller):
<?php
// app/Models/User.php - النموذج
class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
// app/Http/Controllers/UserController.php - المتحكم
class UserController extends Controller
{
public function index()
{
$users = User::with('posts')->paginate(10);
return view('users.index', compact('users'));
}
public function show(User $user)
{
return view('users.show', compact('user'));
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed'
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => Hash::make($validated['password'])
]);
return redirect()->route('users.show', $user)
->with('success', 'تم إنشاء المستخدم بنجاح!');
}
}
Blade Templates - العرض:
{{-- resources/views/users/index.blade.php --}} @extends('layouts.app')
@section('title', 'قائمة المستخدمين') @section('content')
<div class="container">
<h1>المستخدمون</h1>
<div class="row">
@forelse($users as $user)
<div class="col-md-4 mb-3">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ $user->name }}</h5>
<p class="card-text">{{ $user->email }}</p>
<p class="text-muted">عدد المقالات: {{ $user->posts->count() }}</p>
<a href="{{ route('users.show', $user) }}" class="btn btn-primary"
>عرض التفاصيل</a
>
</div>
</div>
</div>
@empty
<div class="col-12">
<div class="alert alert-info">لا يوجد مستخدمون حالياً</div>
</div>
@endforelse
</div>
{{ $users->links() }}
</div>
@endsection
3️⃣ المسارات (Routes) في Laravel
تعريف المسارات الأساسية:
<?php
// routes/web.php
use App\Http\Controllers\UserController;
use App\Http\Controllers\PostController;
// الصفحة الرئيسية
Route::get('/', function () {
return view('welcome');
})->name('home');
// مسارات المستخدمين
Route::resource('users', UserController::class);
// مسارات مخصصة
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware(['auth', 'verified'])
->name('dashboard');
// مجموعة مسارات محمية
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
// API Routes
Route::prefix('api')->group(function () {
Route::apiResource('posts', PostController::class);
Route::get('users/{user}/posts', [UserController::class, 'posts']);
});
Route Model Binding:
<?php
// تلقائياً يجلب User بناء على المعرف
Route::get('/users/{user}', function (User $user) {
return $user;
});
// Custom Key Binding
Route::get('/users/{user:slug}', function (User $user) {
return $user;
});
// في الـ Controller
public function show(User $user)
{
// $user محملة تلقائياً من قاعدة البيانات
return view('users.show', compact('user'));
}
4️⃣ Eloquent ORM - إدارة قواعد البيانات
العلاقات بين النماذج:
<?php
// نموذج المستخدم
class User extends Model
{
// علاقة واحد لكثير - المستخدم له مقالات متعددة
public function posts()
{
return $this->hasMany(Post::class);
}
// علاقة واحد لواحد - المستخدم له ملف شخصي واحد
public function profile()
{
return $this->hasOne(Profile::class);
}
// علاقة كثير لكثير - المستخدم له أدوار متعددة
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
// نموذج المقال
class Post extends Model
{
protected $fillable = ['title', 'content', 'user_id', 'published_at'];
protected $casts = [
'published_at' => 'datetime',
];
// العلاقة العكسية - المقال ينتمي لمستخدم
public function user()
{
return $this->belongsTo(User::class);
}
// علاقة كثير لكثير - المقال له تصنيفات متعددة
public function categories()
{
return $this->belongsToMany(Category::class);
}
// Scope للمقالات المنشورة
public function scopePublished($query)
{
return $query->whereNotNull('published_at');
}
// Accessor للعنوان المنسق
public function getTitleAttribute($value)
{
return ucfirst($value);
}
}
استعلامات Eloquent المتقدمة:
<?php
// جلب البيانات مع العلاقات
$users = User::with(['posts', 'profile'])->get();
// استعلام بشروط معقدة
$publishedPosts = Post::published()
->where('created_at', '>=', now()->subDays(30))
->whereHas('user', function ($query) {
$query->where('status', 'active');
})
->orderBy('created_at', 'desc')
->paginate(15);
// تجميع البيانات
$userStats = User::selectRaw('
COUNT(*) as total_users,
AVG(DATEDIFF(NOW(), created_at)) as avg_days_since_join
')
->whereHas('posts')
->first();
// البحث في النصوص
$posts = Post::where('title', 'LIKE', '%Laravel%')
->orWhere('content', 'LIKE', '%Laravel%')
->get();
// استخدام القواعد المتعددة
$results = DB::table('posts')
->join('users', 'posts.user_id', '=', 'users.id')
->select('posts.*', 'users.name as author_name')
->where('posts.status', 'published')
->get();
5️⃣ أدوات Laravel المساعدة
Artisan Commands:
# إنشاء نماذج ومتحكمات
php artisan make:model Post -mcr # Model + Migration + Controller + Resource
php artisan make:controller ApiController --api
php artisan make:middleware CheckAge
php artisan make:request StoreUserRequest
# إدارة قاعدة البيانات
php artisan migrate
php artisan migrate:rollback
php artisan db:seed
php artisan migrate:fresh --seed
# التخزين المؤقت والأداء
php artisan cache:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
# إنشاء Auth scaffolding
php artisan make:auth
php artisan make:seeder UserSeeder
Configuration Management:
<?php
// config/app.php
return [
'name' => env('APP_NAME', 'Laravel'),
'env' => env('APP_ENV', 'production'),
'debug' => env('APP_DEBUG', false),
'url' => env('APP_URL', 'http://localhost'),
'timezone' => 'Asia/Riyadh',
'locale' => 'ar',
'fallback_locale' => 'en',
];
// استخدام التكوين في التطبيق
$appName = config('app.name');
$isDebug = config('app.debug', false);
// ملف .env
APP_NAME="موقع Laravel"
APP_ENV=local
APP_KEY=base64:generated_key_here
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=
6️⃣ النظام الأمني في Laravel
Authentication & Authorization:
<?php
// إعداد المصادقة
class LoginController extends Controller
{
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (Auth::attempt($credentials, $request->filled('remember'))) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'email' => 'بيانات الدخول غير صحيحة.',
]);
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}
// Middleware للتحقق من الصلاحيات
class CheckRole
{
public function handle($request, Closure $next, ...$roles)
{
if (!Auth::check()) {
return redirect('login');
}
$user = Auth::user();
foreach ($roles as $role) {
if ($user->hasRole($role)) {
return $next($request);
}
}
abort(403, 'غير مصرح لك بالوصول لهذه الصفحة');
}
}
// استخدام Gate للتحكم في الصلاحيات
Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id || $user->hasRole('admin');
});
// في الـ Controller
public function edit(Post $post)
{
$this->authorize('edit-post', $post);
return view('posts.edit', compact('post'));
}
💡 أفضل الممارسات في Laravel
- اتبع PSR Standards - للتأكد من جودة الكود
- استخدم Form Requests للتحقق من البيانات
- فعّل Eager Loading لتجنب N+1 Problem
- استخدم Queue للمهام الثقيلة
- طبق Repository Pattern للمشاريع الكبيرة
- استخدم Events & Listeners للفصل بين المنطق
- فعّل Cache لتحسين الأداء
الخطوة التالية
تعلم Blade Templates و Database Migrations لبناء تطبيقات ديناميكية احترافية.
