Laravel Framework: دليل البداية للمطورين

PHP

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

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>&copy; {{ 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.

📩 تحتاج مساعدة في تعلم Laravel؟

aboutservicesprojectsBlogscontact