الخطوات التالية: مقدمة إلى Laravel
تهانينا على إتمام 35 درسًا من أساسيات لغة PHP! لقد قمتَ ببناء جهاز التوجيه (router) ووحدات التحكم (controllers) وطرق العرض (views) والنماذج (models) الخاصة بك — أليس هذا في جوهره إطار عمل مصغر؟ يقوم Laravel بكل هذا بطريقة أكثر أناقة بعشر مرات. هذا الدرس هو جسر الانتقال من كتابة PHP يدويًّا إلى إطار عمل حديث.
1. لماذا نحتاج إلى إطار عمل؟
لقد واجه نظام المدونة الذي قمت بإنشائه بلغة PHP بالفعل المشكلات التالية:
| المشكلة التي تواجهك | إطار العمل للحل |
|---|---|
| إعادة كتابة عناوين URL باستخدام ملف .htaccess أمر مزعج | التوجيه المدمج في Laravel: Route::get('/posts', ...) |
كل صفحة تحتاج إلى session_start + عمليات التحقق من المصادقة |
البرامج الوسيطة: ->middleware('auth') |
| لغة SQL المكتوبة يدويًّا معرضة للأخطاء؛ كما أن التبديل بين قواعد البيانات أمر صعب | Eloquent ORM: Post::all() |
| طلب جميع الملفات يدويًّا | التحميل التلقائي بواسطة Composer |
| الحماية من CSRF في النماذج بنفسك | @csrf — سطر واحد |
| التغييرات اليدوية في قاعدة البيانات | عمليات الترحيل الخاصة بإدارة الإصدارات |
| كود تجزئة كلمة المرور المتكررة | Hash::make()، Auth::attempt() |
2. تثبيت Laravel
# Create a new project
composer create-project laravel/laravel myblog
# Start the development server
cd myblog
php artisan serve
# Open http://localhost:8000
myblog/ ← Laravel project
├── app/
│ ├── Models/ ← Eloquent models
│ │ └── Post.php
│ └── Http/
│ └── Controllers/ ← Controllers
│ └── PostController.php
├── routes/
│ └── web.php ← Routes (core!)
├── resources/
│ └── views/ ← Blade templates
│ └── posts/
├── database/
│ └── migrations/ ← Database migrations
├── .env ← Environment configuration
└── artisan ← CLI toolkit
3. التوجيه — جهاز التوجيه الذي صممته بنفسك مقابل Laravel
(1) ما صنعته بيديك:
$router->add('GET', '/posts', [$ctrl, 'index']);
$router->add('GET', '/posts/{id}', [$ctrl, 'show']);
(2) إصدار Laravel:
// routes/web.php
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);
// Even cleaner: resource routing (one line generates 7 standard routes)
Route::resource('posts', PostController::class);
// List all routes
// php artisan route:list
4. Eloquent ORM — نموذجك المصمم يدويًّا مقابل Laravel
(1) ما صنعته بيديك:
// ~30 lines of CRUD code
public function getAll(): array { ... }
public function findById(int $id): ?array { ... }
public function create(...): int { ... }
(2) إصدار Laravel:
<?php
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// That's it! Laravel automatically maps to the posts table
protected $fillable = ['title', 'content', 'user_id'];
// Relationship with users
public function user()
{
return $this->belongsTo(User::class);
}
}
// Usage (10 lines of hand-written code → 1 line)
$posts = Post::all();
$post = Post::find(1);
Post::create(['title' => 'Hello', 'content' => 'World', 'user_id' => 1]);
$post->update(['title' => 'New Title']);
$post->delete();
// Relationship query
echo $post->user->username; // Automatically JOINs the users table
?>
5. قوالب Blade — طريقة العرض التي قمت بإنشائها يدويًّا بلغة PHP مقابل Blade
(1) ما صنعته بيديك:
<?php foreach ($posts as $post): ?>
<h2><?= htmlspecialchars($post['title']) ?></h2>
<?php endforeach; ?>
▶ مثال: قالب قائمة منشورات Blade
{{-- resources/views/posts/index.blade.php --}}
@extends('layouts.app')
@section('content')
<h2>All Posts</h2>
@foreach ($posts as $post)
<div class="post-card">
<h2><a href="/posts/{{ $post->id }}">{{ $post->title }}</a></h2>
<p>{{ Str::limit($post->content, 200) }}</p>
</div>
@endforeach
{{-- Pagination links auto-generated! --}}
{{ $posts->links() }}
@endsection
ميزات الشفرة:
{{ $var }}يطبق تلقائيًاhtmlspecialchars(حماية من هجمات XSS)@if @else @endif/@foreach @endforeach— صيغة أكثر وضوحًا@extends/@section— وراثة القوالب@csrf— يقوم تلقائيًا بإنشاء حقل مخفي لرمز CSRF
6. عمليات الترحيل — إدارة بنية قاعدة البيانات
لم يعد هناك داعٍ لتنفيذ أوامر SQL يدويًّا لإنشاء الجداول. حدد بنية الجدول في الكود:
# Create a migration file
php artisan make:migration create_posts_table
# Run migrations
php artisan migrate
# Rollback
php artisan migrate:rollback
<?php
// database/migrations/xxx_create_posts_table.php
return new class extends Migration
{
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->string('title');
$table->text('content');
$table->timestamps(); // created_at + updated_at auto-managed
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
php artisan migrate:rollback يقوم بالرجوع إلى الإصدار السابق تمامًا مثل Git؛ (2) التعاون الجماعي — يقوم الجميع بتشغيل عمليات الترحيل نفسها ويحصلون على نفس بنية الجداول؛ (3) المعالجة التلقائية لأسماء الحقول وأنواعها والفهارس والمفاتيح الخارجية.
7. نظام المصادقة — 50 سطراً مكتوبة يدوياً مقابل 3 أسطر في Laravel
(1) ما صنعته بيديك:
// Password verification + Session management + Logout + Permission checks = ~50 lines
(2) إصدار Laravel:
# One command generates a complete auth system (login/register/password reset/email verification)
composer require laravel/breeze
php artisan breeze:install blade
php artisan migrate
npm install && npm run build
// Route protection
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
// Get the current user
$user = auth()->user();
echo $user->posts; // Auto relationship query
8. Artisan — مجموعة أدوات واجهة سطر الأوامر الخاصة بك
# Create a controller
php artisan make:controller PostController
# Create a model (generates Migration + Factory + Seeder together)
php artisan make:model Post -a
# Database operations
php artisan migrate # Run migrations
php artisan db:seed # Seed test data
php artisan migrate:fresh --seed # Reset database + seed
# Debugging
php artisan route:list # List all routes
php artisan tinker # Interactive PHP REPL (can directly operate on the database)
9. نظام مدونة Laravel — النسخة الكاملة
▶ مثال: وحدة تحكم Laravel كاملة
<?php
// routes/web.php
use App\Http\Controllers\PostController;
Route::get('/', [PostController::class, 'index']);
Route::resource('posts', PostController::class)->middleware('auth');
Route::get('/register', [RegisteredUserController::class, 'create']);
Route::post('/register', [RegisteredUserController::class, 'store']);
<?php
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
$posts = Post::with('user')->latest()->paginate(10);
return view('posts.index', compact('posts'));
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:200',
'content' => 'required',
]);
Post::create([
...$validated,
'user_id' => auth()->id(),
]);
return redirect('/posts')->with('success', 'Post published successfully!');
}
}
قارن: استهلكت مدونتك المكتوبة يدويًّا حوالي 150 سطرًا لـ PostController. أما Laravel فتستهلك حوالي 20 سطرًا — وتأتي نسخة Laravel مزودة مسبقًا بخصائص مدمجة مثل منع حقن SQL، والحماية من CSRF، والتحقق من صحة النماذج، وتقسيم الصفحات.
10. خارطة طريق تعلم لغة PHP
✅ You've completed:
Fundamentals (variables, arrays, functions, loops, conditionals)
↓
Web Interaction (forms, cookies, sessions, file uploads) ← 36 lessons done
↓
OOP (classes, inheritance, interfaces, traits, namespaces, Composer)
↓
Database Operations (MySQL, PDO, transactions, security)
↓
PHP 8 Modern Features (enums, match, constructor property promotion)
↓
🔜 Your next steps:
1. Rewrite the blog system in Laravel (this week)
— Internalize the framework mindset, experience the productivity leap
2. Learn REST API development
— JSON responses, frontend-backend separation
3. Explore testing (PHPUnit/Pest)
— Protect your code with automated tests
4. Dive deeper:
— Laravel ecosystem (Eloquent, Queues, Events, Notifications)
— Design patterns (Repository, Service, Factory)
— Performance optimization (Redis caching, N+1 query, Opcache)
❓ أسئلة شائعة
📖 ملخص
- لا تضيف الأطر تعقيدًا، بل تعمل على تنظيم القدرات الموجودة
- Laravel:
Route::get()التوجيه →EloquentORM →Bladeالقوالب →Artisanواجهة سطر الأوامر (CLI) Post::all()يحل محلSELECT * FROM postsالمكتوب بخط اليد@foreachيحل محل<?php foreach ?>php artisanأدوات إنشاء الأوامر النصية تعزز الإنتاجية- لقد أتقنت المفاهيم الأساسية لنموذج MVC — و«Laravel» تجعل نموذج MVC أكثر أناقةً
- وثائق Laravel: https://laravel.com/docs
- مجتمع Laravel: https://laracasts.com
📝 تمارين
- قم بتثبيت Laravel، وأنشئ مشروعًا جديدًا، وشغّل
php artisan serveلترى صفحة الترحيب. - استخدم
php artisan make:model Post -aلإنشاء مورد منشور كامل. اكتب عملية ترحيل لإنشاء الجدول. أدخل بعض البيانات التجريبية باستخدام Tinker. - أعد كتابة صفحة قائمة المنشورات وصفحة تفاصيل المنشور في نظام المدونة الخاص بك باستخدام Laravel (قوالب Blade + استعلامات Eloquent). قارن التجربة مع النسخة التي كتبتها يدويًّا.
🎉 تهانينا على إكمال 36 درسًا من دورة PHP التعليمية! لقد بدأت دون أي معرفة مسبقة بـ
echo، وانتهيت كمطور قادر على بناء تطبيقات ويب كاملة بلغة PHP، وفهم بنية MVC، وإتقان عمليات قواعد البيانات والأمن. عالم PHP واسع — فـ WordPress و Laravel و Drupal و Symfony كلها في انتظارك. استمر في التقدم! 🚀



