مقدمة في Laravel: أقوى إطار عمل PHP الحديث

Laravel

مقدمة في Laravel: أقوى إطار عمل PHP الحديث
دليل شامل للمبتدئين في Laravel، أهم ميزاته، وكيفية البدء في تطوير تطبيقات الويب الحديثة باستخدام أحدث التقنيات.
#Laravel#PHP Framework#Web Development#MVC#Artisan#Eloquent

مقدمة في 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

  1. اتبع PSR Standards - للتأكد من جودة الكود
  2. استخدم Form Requests للتحقق من البيانات
  3. فعّل Eager Loading لتجنب N+1 Problem
  4. استخدم Queue للمهام الثقيلة
  5. طبق Repository Pattern للمشاريع الكبيرة
  6. استخدم Events & Listeners للفصل بين المنطق
  7. فعّل Cache لتحسين الأداء

الخطوة التالية

تعلم Blade Templates و Database Migrations لبناء تطبيقات ديناميكية احترافية.

📩 هل تحتاج مساعدة في تطوير تطبيق Laravel؟

aboutservicesprojectsBlogscontact