Laravel Framework: دليل البداية للمطورين
دليل متخصص من علاء عامر - مطور ومصمم مواقع وتطبيقات احترافية
Laravel هو أحد أقوى إطارات عمل PHP وأكثرها شعبية في العالم. يتميز بسهولة الاستخدام، الأمان العالي، والأدوات المتقدمة التي تسرع عملية التطوير.
1️⃣ لماذا Laravel؟
| الميزة | التفصيل | الفائدة |
|---|---|---|
| Eloquent ORM | تفاعل سهل مع قواعد البيانات | كود أقل وأكثر وضوحاً |
| Blade Template Engine | نظام قوالب متقدم | فصل المنطق عن التصميم |
| Artisan CLI | أوامر سطر الأوامر | أتمتة المهام المتكررة |
| Migration System | إدارة هيكل قاعدة البيانات | نسخ احتياطية وتحديثات آمنة |
2️⃣ تثبيت Laravel
المتطلبات الأساسية:
- PHP 8.1 أو أحدث
- Composer
- Node.js & NPM (اختياري للـ Frontend)
طريقة التثبيت:
# تثبيت Laravel عالمياً
composer global require laravel/installer
# إنشاء مشروع جديد
laravel new my-project
# أو باستخدام Composer
composer create-project laravel/laravel my-project
# دخول المشروع
cd my-project
# تشغيل الخادم المحلي
php artisan serve
3️⃣ هيكل مشروع Laravel
my-project/
├── app/ # منطق التطبيق الأساسي
│ ├── Http/
│ │ ├── Controllers/ # المتحكمات
│ │ └── Middleware/ # الوسائط
│ ├── Models/ # نماذج قاعدة البيانات
│ └── Providers/ # مقدمو الخدمات
├── config/ # ملفات الإعداد
├── database/ # Migrations و Seeds
├── resources/ # المشاهدات والأصول
│ ├── views/ # ملفات Blade
│ └── css/ # ملفات التنسيق
├── routes/ # تعريف المسارات
│ ├── web.php # مسارات الويب
│ └── api.php # مسارات API
├── storage/ # ملفات التخزين
└── .env # متغيرات البيئة
4️⃣ إعداد قاعدة البيانات
ملف .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_project_db
DB_USERNAME=root
DB_PASSWORD=
إنشاء Migration:
# إنشاء migration جديد
php artisan make:migration create_users_table
# تشغيل migrations
php artisan migrate
# إعادة تعيين قاعدة البيانات
php artisan migrate:refresh
مثال على Migration:
<?php
// database/migrations/2023_xx_xx_create_posts_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->string('slug')->unique();
$table->boolean('is_published')->default(false);
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('posts');
}
};
5️⃣ إنشاء Model و Controller
إنشاء Model:
# إنشاء model مع migration وcontroller
php artisan make:model Post -mcr
# m = migration, c = controller, r = resource methods
مثال على Model:
<?php
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title', 'content', 'slug', 'is_published', 'user_id'
];
protected $casts = [
'is_published' => 'boolean',
'created_at' => 'datetime',
];
// العلاقة مع المستخدم
public function user()
{
return $this->belongsTo(User::class);
}
// Scope للمقالات المنشورة
public function scopePublished($query)
{
return $query->where('is_published', true);
}
// Accessor للرابط
public function getUrlAttribute()
{
return route('posts.show', $this->slug);
}
}
مثال على Controller:
<?php
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class PostController extends Controller
{
public function index()
{
$posts = Post::published()
->with('user')
->latest()
->paginate(10);
return view('posts.index', compact('posts'));
}
public function show($slug)
{
$post = Post::where('slug', $slug)
->published()
->with('user')
->firstOrFail();
return view('posts.show', compact('post'));
}
public function create()
{
return view('posts.create');
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:255',
'content' => 'required',
]);
$validated['slug'] = Str::slug($validated['title']);
$validated['user_id'] = auth()->id();
$post = Post::create($validated);
return redirect()->route('posts.show', $post->slug)
->with('success', 'تم إنشاء المقال بنجاح');
}
public function edit(Post $post)
{
$this->authorize('update', $post);
return view('posts.edit', compact('post'));
}
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
$validated = $request->validate([
'title' => 'required|max:255',
'content' => 'required',
'is_published' => 'boolean',
]);
$validated['slug'] = Str::slug($validated['title']);
$post->update($validated);
return redirect()->route('posts.show', $post->slug)
->with('success', 'تم تحديث المقال بنجاح');
}
public function destroy(Post $post)
{
$this->authorize('delete', $post);
$post->delete();
return redirect()->route('posts.index')
->with('success', 'تم حذف المقال بنجاح');
}
}
6️⃣ المسارات (Routes)
<?php
// routes/web.php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
// الصفحة الرئيسية
Route::get('/', function () {
return view('welcome');
});
// مسارات المقالات
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/create', [PostController::class, 'create'])
->middleware('auth')
->name('posts.create');
Route::post('/posts', [PostController::class, 'store'])
->middleware('auth')
->name('posts.store');
Route::get('/posts/{slug}', [PostController::class, 'show'])->name('posts.show');
// مسارات محمية بالتسجيل
Route::middleware('auth')->group(function () {
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->name('posts.edit');
Route::put('/posts/{post}', [PostController::class, 'update'])->name('posts.update');
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy');
});
// Authentication Routes
require __DIR__.'/auth.php';
7️⃣ Blade Templates
Layout الأساسي:
{{-- resources/views/layouts/app.blade.php --}}
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title', 'موقع Laravel')</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body>
<nav class="navbar">
<div class="container">
<a href="{{ route('posts.index') }}" class="logo">
موقع Laravel
</a>
<div class="nav-links">
@auth
<a href="{{ route('posts.create') }}">مقال جديد</a>
<form method="POST" action="{{ route('logout') }}" style="display: inline;">
@csrf
<button type="submit">تسجيل خروج</button>
</form>
@else
<a href="{{ route('login') }}">تسجيل دخول</a>
<a href="{{ route('register') }}">إنشاء حساب</a>
@endauth
</div>
</div>
</nav>
<main class="container">
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
@yield('content')
</main>
<footer>
<p>© {{ date('Y') }} موقع Laravel. جميع الحقوق محفوظة.</p>
</footer>
</body>
</html>
صفحة المقالات:
{{-- resources/views/posts/index.blade.php --}}
@extends('layouts.app')
@section('title', 'جميع المقالات')
@section('content')
<div class="posts-header">
<h1>أحدث المقالات</h1>
@auth
<a href="{{ route('posts.create') }}" class="btn btn-primary">
مقال جديد
</a>
@endauth
</div>
<div class="posts-grid">
@forelse($posts as $post)
<article class="post-card">
<h2>
<a href="{{ route('posts.show', $post->slug) }}">
{{ $post->title }}
</a>
</h2>
<div class="post-meta">
<span>بواسطة: {{ $post->user->name }}</span>
<span>{{ $post->created_at->diffForHumans() }}</span>
</div>
<p>{{ Str::limit($post->content, 150) }}</p>
<a href="{{ route('posts.show', $post->slug) }}" class="read-more">
اقرأ المزيد
</a>
</article>
@empty
<div class="no-posts">
<p>لا توجد مقالات حتى الآن.</p>
@auth
<a href="{{ route('posts.create') }}" class="btn btn-primary">
اكتب أول مقال
</a>
@endauth
</div>
@endforelse
</div>
{{ $posts->links() }}
@endsection
💡 أوامر Artisan المهمة
# إنشاء مكونات جديدة
php artisan make:model ModelName
php artisan make:controller ControllerName
php artisan make:migration create_table_name
php artisan make:seeder SeederName
php artisan make:middleware MiddlewareName
# إدارة قاعدة البيانات
php artisan migrate
php artisan migrate:rollback
php artisan db:seed
# إدارة التخزين المؤقت
php artisan cache:clear
php artisan config:cache
php artisan route:cache
# صيانة التطبيق
php artisan down
php artisan up
# إنشاء مفتاح التطبيق
php artisan key:generate
الخطوة التالية
بعد إتقان الأساسيات، انتقل إلى APIs، Testing، و Advanced Laravel Features.
