Laravel v12.x | GitHub | Telegram

التثبيت

يتطلب Laravel بعض المتطلبات الأساسية قبل التثبيت. تأكد من أن بيئة التطوير لديك تلبي المتطلبات التالية:

متطلبات النظام

  • PHP >= 8.1
  • BCMath PHP Extension
  • Ctype PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

تثبيت Laravel

هناك عدة طرق لتثبيت Laravel:

باستخدام Composer Create-Project

يمكنك استخدام أمر composer create-project لإنشاء مشروع Laravel جديد:

composer create-project laravel/laravel example-app
cd example-app
php artisan serve

سيقوم الأمر الأخير بتشغيل خادم التطوير المدمج في Laravel على العنوان http://localhost:8000.

باستخدام Laravel Installer

يمكنك أيضًا تثبيت أداة Laravel العالمية عبر Composer:

composer global require laravel/installer
laravel new example-app
cd example-app
php artisan serve

باستخدام Docker مع Laravel Sail

يوفر Laravel أداة Sail وهي واجهة سطر أوامر خفيفة للتفاعل مع بيئة Docker:

curl -s "https://laravel.build/example-app" | bash
cd example-app
./vendor/bin/sail up

هذا سيقوم بإنشاء مشروع Laravel مع بيئة Docker كاملة تشمل PHP، MySQL، Redis، وخدمات أخرى.

الإعدادات

بعد تثبيت Laravel، ستحتاج إلى تكوين بعض الإعدادات الأساسية للتطبيق.

ملف .env

يحتوي ملف .env على متغيرات البيئة التي يستخدمها التطبيق. قم بنسخ ملف .env.example إلى .env:

cp .env.example .env

ثم قم بتوليد مفتاح التطبيق:

php artisan key:generate

إعدادات قاعدة البيانات

عدل الإعدادات في ملف .env لتكوين اتصال قاعدة البيانات:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

ملفات التكوين

يحتوي مجلد config على جميع ملفات إعدادات التطبيق. راجع هذه الملفات للتعرف على الخيارات المتاحة:

  • config/app.php - إعدادات التطبيق العامة
  • config/database.php - إعدادات قاعدة البيانات
  • config/cache.php - إعدادات التخزين المؤقت
  • config/mail.php - إعدادات البريد الإلكتروني

هيكل المشروع

يتبع مشروع Laravel هيكلًا منظمًا للملفات والمجلدات. فهم هذا الهيكل يساعدك على التنقل في المشروع بسهولة.

المجلدات الرئيسية

مجلد app

يحتوي على الكود الأساسي للتطبيق، بما في ذلك:

  • app/Console - أوامر Artisan المخصصة
  • app/Exceptions - معالجة الاستثناءات
  • app/Http - المتحكمات، الوسيطات، والطلبات
  • app/Models - نماذج Eloquent
  • app/Providers - مزودي خدمات التطبيق

مجلد config

يحتوي على جميع ملفات إعدادات التطبيق.

مجلد database

يحتوي على ترحيلات قاعدة البيانات، البذور، والمصانع:

  • database/migrations - ترحيلات قاعدة البيانات
  • database/seeders - بذور قاعدة البيانات
  • database/factories - مصانع النماذج

مجلد public

نقطة الدخول للتطبيق (index.php) والأصول العامة كالصور وملفات CSS و JavaScript.

مجلد resources

يحتوي على العروض، الأصول الخام (SASS، JavaScript)، وملفات اللغة:

  • resources/views - قوالب Blade
  • resources/lang - ملفات الترجمة
  • resources/css - ملفات CSS
  • resources/js - ملفات JavaScript

مجلد routes

يحتوي على جميع تعريفات المسارات للتطبيق:

  • routes/web.php - مسارات الويب
  • routes/api.php - مسارات API
  • routes/console.php - أوامر Artisan
  • routes/channels.php - قنوات البث

مجلد storage

يحتوي على الملفات المنشأة من التطبيق، مثل السجلات، ملفات الجلسة، وملفات التخزين المؤقت.

التوجيه (Routing)

يدير نظام التوجيه في Laravel توجيه HTTP طلبات المستخدم إلى المتحكمات أو الإجراءات المحددة.

تعريف المسارات الأساسية

يتم تعريف المسارات في الملفات الموجودة في مجلد routes. الملف الرئيسي لمسارات الويب هو routes/web.php:

use Illuminate\Support\Facades\Route;

// مسار بسيط يعرض نص
Route::get('/hello', function () {
    return 'Hello, World!';
});

// مسار يعرض عرض
Route::get('/', function () {
    return view('welcome');
});

// مسار يوجه إلى متحكم
Route::get('/users', [UserController::class, 'index']);

طرق الطلب المتاحة

يدعم Laravel مختلف طرق HTTP:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

// استجابة لأكثر من طريقة
Route::match(['get', 'post'], '/form', $callback);

// استجابة لجميع الطرق
Route::any('/page', $callback);

وسائط المسار

يمكنك تحديد وسائط (متغيرات) في مساراتك لالتقاط أجزاء من URI:

// وسيط بسيط
Route::get('/users/{id}', function ($id) {
    return 'User '.$id;
});

// وسيط اختياري
Route::get('/posts/{post?}', function ($post = null) {
    return $post ?? 'All Posts';
});

// وسائط متعددة
Route::get('/posts/{category}/{post}', function ($category, $post) {
    return "Category: $category, Post: $post";
});

مسارات مسماة

يمكنك تسمية المسارات لإنشاء روابط إليها بسهولة:

Route::get('/profile', function () {
    // ...
})->name('profile');

// استخدام المسار المسمى
$url = route('profile');
return redirect()->route('profile');

مجموعات المسارات

يمكنك تجميع المسارات لتطبيق خصائص مشتركة عليها:

// تطبيق بادئة مشتركة ووسيط
Route::prefix('admin')->middleware('auth')->group(function () {
    Route::get('/dashboard', function () {
        // مسار /admin/dashboard
    });
    
    Route::get('/users', function () {
        // مسار /admin/users
    });
});

المتحكمات (Controllers)

المتحكمات هي جزء من نمط MVC (Model-View-Controller) وتحتوي على المنطق الذي يتعامل مع طلبات HTTP.

إنشاء متحكم

يمكنك إنشاء متحكم جديد باستخدام أمر Artisan:

php artisan make:controller UserController

إذا كنت تريد إنشاء متحكم مع طرق CRUD الأساسية:

php artisan make:controller UserController --resource

متحكم أساسي

فيما يلي مثال لمتحكم بسيط:

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    // عرض قائمة المستخدمين
    public function index()
    {
        $users = User::all();
        return view('users.index', ['users' => $users]);
    }
    
    // عرض مستخدم محدد
    public function show($id)
    {
        $user = User::findOrFail($id);
        return view('users.show', ['user' => $user]);
    }
    
    // عرض نموذج إنشاء مستخدم جديد
    public function create()
    {
        return view('users.create');
    }
    
    // حفظ مستخدم جديد
    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8',
        ]);
        
        $user = User::create($validated);
        
        return redirect()->route('users.show', $user->id)
                         ->with('success', 'تم إنشاء المستخدم بنجاح');
    }
    
    // عرض نموذج تعديل مستخدم
    public function edit($id)
    {
        $user = User::findOrFail($id);
        return view('users.edit', ['user' => $user]);
    }
    
    // تحديث مستخدم
    public function update(Request $request, $id)
    {
        $user = User::findOrFail($id);
        
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email,'.$id,
        ]);
        
        $user->update($validated);
        
        return redirect()->route('users.show', $user->id)
                         ->with('success', 'تم تحديث المستخدم بنجاح');
    }
    
    // حذف مستخدم
    public function destroy($id)
    {
        $user = User::findOrFail($id);
        $user->delete();
        
        return redirect()->route('users.index')
                         ->with('success', 'تم حذف المستخدم بنجاح');
    }
}

ربط المتحكم بالمسارات

لربط المتحكم بالمسارات:

use App\Http\Controllers\UserController;

// طريقة واحدة
Route::get('/users', [UserController::class, 'index']);

// مسارات المصادر
Route::resource('users', UserController::class);

// مسارات المصادر مع تحديد الطرق
Route::resource('users', UserController::class)->only(['index', 'show']);
Route::resource('users', UserController::class)->except(['create', 'store', 'destroy']);

الطلبات (Requests)

تمثل كائنات Request طلبات HTTP الواردة وتوفر وسائل للوصول إلى البيانات المرسلة مع الطلب.

الوصول إلى بيانات الطلب

يمكنك الوصول إلى بيانات الطلب بعدة طرق:

public function store(Request $request)
{
    // الوصول إلى جميع البيانات
    $allData = $request->all();
    
    // الوصول إلى قيمة محددة
    $name = $request->input('name');
    
    // الوصول باستخدام صيغة النقطة (لمصفوفات مترابطة)
    $firstName = $request->input('user.first_name');
    
    // الوصول باستخدام صيغة الخاصية المباشرة
    $email = $request->email;
    
    // التحقق من وجود قيمة
    if ($request->has('name')) {
        // ...
    }
    
    // القيمة الافتراضية إذا كانت غير موجودة
    $page = $request->input('page', 1);
}

ملفات الطلب

للوصول إلى الملفات المرفوعة في الطلب:

public function store(Request $request)
{
    // التحقق من وجود ملف
    if ($request->hasFile('photo')) {
        // الحصول على الملف
        $file = $request->file('photo');
        
        // التأكد من صحة الملف المرفوع
        if ($file->isValid()) {
            // الحصول على اسم الملف الأصلي
            $filename = $file->getClientOriginalName();
            
            // الحصول على امتداد الملف
            $extension = $file->getClientOriginalExtension();
            
            // الحصول على حجم الملف
            $size = $file->getSize();
            
            // تخزين الملف
            $path = $file->store('photos');
            // أو تخزينه باسم مخصص
            $path = $file->storeAs('photos', $filename);
        }
    }
}

طلبات الفورم طلبات التحقق

يمكنك إنشاء فئات طلب مخصصة للتحقق من البيانات:

php artisan make:request StoreUserRequest
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    /**
     * تحديد ما إذا كان الطلب مسموح به
     */
    public function authorize()
    {
        return true; // يمكن استخدام المنطق لتحديد التفويض
    }

    /**
     * قواعد التحقق
     */
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
        ];
    }
    
    /**
     * رسائل الخطأ المخصصة
     */
    public function messages()
    {
        return [
            'name.required' => 'حقل الاسم مطلوب',
            'email.unique' => 'البريد الإلكتروني مستخدم بالفعل',
        ];
    }
}

ثم استخدم طلب التحقق المخصص في المتحكم:

public function store(StoreUserRequest $request)
{
    // البيانات مصادق عليها بالفعل
    $validated = $request->validated();
    
    // إنشاء المستخدم
    $user = User::create($validated);
    
    return redirect()->route('users.show', $user->id);
}

الاستجابات (Responses)

تمثل الاستجابات البيانات المرسلة مرة أخرى إلى المستخدم.

أنواع الاستجابات الأساسية

يمكنك إرجاع أنواع مختلفة من الاستجابات:

// إرجاع سلسلة نصية
return 'Hello World';

// إرجاع مصفوفة (سيتم تحويلها تلقائيًا إلى JSON)
return ['name' => 'John', 'age' => 30];

// إرجاع عرض
return view('welcome', ['name' => 'John']);

// إرجاع كائن استجابة
return response('Hello World', 200)
    ->header('Content-Type', 'text/plain');

// إرجاع JSON
return response()->json([
    'name' => 'John',
    'age' => 30
]);

// تنزيل ملف
return response()->download($pathToFile);

// عرض ملف
return response()->file($pathToFile);

التحويلات (Redirects)

يمكنك إرجاع تحويلات:

// تحويل إلى URL
return redirect('/home');

// تحويل إلى مسار مسمى
return redirect()->route('users.show', ['id' => 1]);

// تحويل إلى متحكم وإجراء
return redirect()->action([UserController::class, 'show'], ['id' => 1]);

// تحويل للخلف
return redirect()->back();

// تحويل مع بيانات الجلسة المؤقتة
return redirect()->route('users.index')
    ->with('success', 'تم حفظ البيانات بنجاح');

رموز الحالة HTTP

يمكنك ضبط رموز حالة HTTP للاستجابات:

// ضبط رمز الحالة
return response('محتوى', 201);

// استجابات شائعة
return response()->noContent(); // 204
return response()->json(['error' => 'غير مصرح به'], 401);
return response()->json(['error' => 'غير موجود'], 404);
return response()->json(['error' => 'خطأ في الخادم'], 500);

العروض (Views)

تستخدم العروض لفصل عرض البيانات عن منطق التطبيق. تستخدم Laravel محرك قوالب Blade.

إنشاء عرض

تُخزن العروض في المجلد resources/views. على سبيل المثال، قد يبدو عرض بسيط resources/views/welcome.blade.php كما يلي:





    مرحبًا


    

مرحبًا، {{ $name }}!

عرض العروض من المتحكم

لعرض العروض من المتحكم:

public function show()
{
    return view('welcome', ['name' => 'John']);
    
    // أو بدالة with
    return view('welcome')->with('name', 'John');
    
    // أو باستخدام الكائن عبر compact
    $name = 'John';
    return view('welcome', compact('name'));
}

وسم Blade الأساسية

توفر Blade العديد من الوسوم للقوالب:

{{-- هذا تعليق --}}

{{-- عرض البيانات --}}
{{ $variable }} {{-- قيمة المتغير مع حماية من XSS --}}
{!! $variable !!} {{-- قيمة المتغير بدون حماية --}}

{{-- العبارات الشرطية --}}
@if($user->isAdmin)
    أهلاً يا مسؤول!
@elseif($user->isModerator)
    أهلاً يا مشرف!
@else
    أهلاً يا مستخدم!
@endif

{{-- عبارات تبدأ ب unless --}}
@unless($user->isAdmin)
    أنت لست مسؤولاً.
@endunless

{{-- الحلقات التكرارية --}}
@foreach($users as $user)
    

{{ $user->name }}

@endforeach @for($i = 0; $i < 10; $i++)

الرقم: {{ $i }}

@endfor @while($condition)

الحلقة تعمل

@endwhile {{-- القوالب --}} @extends('layouts.app') @section('title', 'عنوان الصفحة') @section('content')

محتوى الصفحة

@endsection {{-- تضمين جزء من العرض --}} @include('shared.errors') {{-- تضمين جزء شرطيًا --}} @includeWhen($boolean, 'view.name') {{-- تضمين عرض أول مرة --}} @includeFirst(['custom.admin', 'admin'], ['some' => 'data'])

مكونات Blade

توفر Blade آلية للمكونات لإعادة استخدام أجزاء من العروض:

{{-- إنشاء مكون: resources/views/components/alert.blade.php --}}
{{ $slot }}
{{-- استخدام المكون --}} @component('components.alert', ['type' => 'danger']) خطأ! حدث شيء ما. @endcomponent {{-- باستخدام صيغة الوسوم (Laravel 7+) --}} خطأ! حدث شيء ما.

إعدادات قاعدة البيانات

يدعم Laravel عدة أنظمة قواعد بيانات مثل MySQL و PostgreSQL و SQLite و SQL Server.

إعداد قاعدة البيانات

تحدد إعدادات قاعدة البيانات في ملف .env وملف config/database.php.

# في ملف .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

الاتصال بقاعدة البيانات

يمكنك استخدام واجهة DB للاتصال بقاعدة البيانات وتنفيذ الاستعلامات:

use Illuminate\Support\Facades\DB;

// استعلام بسيط
$users = DB::select('select * from users where active = ?', [1]);

// إدراج بيانات
DB::insert('insert into users (name, email) values (?, ?)', ['John', '[email protected]']);

// تحديث بيانات
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);

// حذف بيانات
$deleted = DB::delete('delete from users where id = ?', [1]);

الترحيلات (Migrations)

الترحيلات هي نوع من التحكم في الإصدار لقاعدة البيانات، تسمح لك بتعريف وتحديث مخطط قاعدة البيانات.

إنشاء ترحيل

يمكنك إنشاء ترحيل جديد باستخدام أمر Artisan:

php artisan make:migration create_users_table

مثال لملف ترحيل:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * تشغيل الترحيل
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * تراجع عن الترحيل
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

تشغيل الترحيلات

لتشغيل جميع الترحيلات:

php artisan migrate

أوامر ترحيل أخرى:

# التراجع عن آخر دفعة ترحيل
php artisan migrate:rollback

# التراجع عن جميع الترحيلات
php artisan migrate:reset

# التراجع ثم إعادة تشغيل جميع الترحيلات
php artisan migrate:refresh

# حذف جميع الجداول ثم إعادة تشغيل جميع الترحيلات
php artisan migrate:fresh

أنواع الأعمدة الشائعة

فيما يلي أنواع الأعمدة الشائعة:

$table->id(); // صنف زيادة عددية معرف أساسي
$table->foreignId('user_id'); // معرف أجنبي
$table->string('name', 100); // سلسلة نصية بطول اختياري
$table->text('description'); // نص طويل
$table->integer('count'); // عدد صحيح
$table->bigInteger('big_count'); // عدد صحيح كبير
$table->float('amount', 8, 2); // رقم عشري
$table->decimal('amount', 8, 2); // رقم عشري دقيق
$table->boolean('confirmed'); // قيمة منطقية
$table->date('created_at'); // تاريخ
$table->dateTime('created_at'); // تاريخ ووقت
$table->time('sunrise'); // وقت
$table->timestamp('added_at'); // طابع زمني
$table->timestamps(); // أعمدة created_at و updated_at
$table->softDeletes(); // عمود deleted_at للحذف الناعم
$table->enum('difficulty', ['easy', 'medium', 'hard']); // تعداد
$table->json('options'); // سلسلة JSON
$table->jsonb('options'); // سلسلة JSON باستخدام jsonb في بوستجريسكل

Eloquent ORM

Eloquent هو نظام ORM المدمج في Laravel (Object-Relational Mapper) ويوفر واجهة برمجة بسيطة ومريحة للتعامل مع قاعدة البيانات.

إنشاء نموذج

يمكنك إنشاء نموذج جديد باستخدام أمر Artisan:

php artisan make:model Post

أو إنشاء نموذج مع ترحيل:

php artisan make:model Post --migration

مثال لنموذج بسيط:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // الجدول المرتبط بالنموذج (اختياري)
    protected $table = 'posts';
    
    // المفتاح الأساسي (اختياري)
    protected $primaryKey = 'id';
    
    // إذا كان المفتاح الأساسي غير زيادة عددية
    public $incrementing = false;
    
    // نوع المفتاح الأساسي (اختياري)
    protected $keyType = 'string';
    
    // هل يستخدم النموذج طوابع الوقت
    public $timestamps = true;
    
    // تخصيص أسماء أعمدة طوابع الوقت
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
    
    // الصفات التي يمكن تعيينها بشكل جماعي
    protected $fillable = [
        'title', 'content', 'user_id', 'published'
    ];
    
    // الصفات التي يجب تمثيلها كمصفوفة
    protected $casts = [
        'published' => 'boolean',
        'options' => 'array',
        'published_at' => 'datetime',
    ];
}

العمليات الأساسية

العمليات الأساسية مع Eloquent:

// استرجاع جميع السجلات
$posts = Post::all();

// استرجاع سجل واحد بمعرفه
$post = Post::find(1);

// استرجاع السجل الأول الذي يطابق الشرط
$post = Post::where('published', true)->first();

// التحقق من وجود السجل أو فشل بالعثور عليه
$post = Post::findOrFail(1);
$post = Post::where('published', true)->firstOrFail();

// العدد والحد والإزاحة
$posts = Post::where('published', true)
    ->orderBy('created_at', 'desc')
    ->skip(10)
    ->take(5)
    ->get();

// إنشاء سجل جديد
$post = new Post;
$post->title = 'عنوان المقال';
$post->content = 'محتوى المقال';
$post->save();

// إنشاء باستخدام التعيين الجماعي
$post = Post::create([
    'title' => 'عنوان المقال',
    'content' => 'محتوى المقال',
]);

// تحديث سجل
$post = Post::find(1);
$post->title = 'عنوان جديد';
$post->save();

// تحديث باستخدام التعيين الجماعي
$post = Post::find(1);
$post->update([
    'title' => 'عنوان جديد',
    'content' => 'محتوى جديد',
]);

// حذف سجل
$post = Post::find(1);
$post->delete();

// حذف بواسطة المعرف
Post::destroy(1);
Post::destroy([1, 2, 3]);

العلاقات

تعريف العلاقات في Eloquent:

// علاقة واحد لواحد
public function profile()
{
    return $this->hasOne(Profile::class);
}

// علاقة واحد لواحد عكسية
public function user()
{
    return $this->belongsTo(User::class);
}

// علاقة واحد لمتعدد
public function posts()
{
    return $this->hasMany(Post::class);
}

// علاقة متعدد لمتعدد
public function roles()
{
    return $this->belongsToMany(Role::class);
}

// علاقة متعدد لمتعدد مع بيانات جدول وسيط
public function roles()
{
    return $this->belongsToMany(Role::class)->withPivot('column1', 'column2');
}

// علاقة واحد عبر متعدد (has many through)
public function comments()
{
    return $this->hasManyThrough(Comment::class, Post::class);
}

// علاقة متعدد-متعدد منتمية
public function posts()
{
    return $this->morphedByMany(Post::class, 'taggable');
}

استخدام العلاقات

التعامل مع العلاقات:

// الوصول إلى العلاقة
$user = User::find(1);
$profile = $user->profile;
$posts = $user->posts;

// التحميل المسبق للعلاقات (حل مشكلة N+1)
$users = User::with('posts')->get();

// تحميل شرطي للعلاقات
$posts = Post::with(['user' => function ($query) {
    $query->where('active', true);
}])->get();

// فلترة باستخدام العلاقات
$users = User::has('posts', '>=', 3)->get();
$users = User::whereHas('posts', function ($query) {
    $query->where('published', true);
})->get();