0Pricing
PHP Academy · درس

Policies: التفويض القائم على النماذج

اربطوا Policies بنماذج Eloquent واستخدموها في وحدات التحكم

Policies: التفويض القائم على النماذج درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.

ما هي Policy؟

إن Policy صنف ينظّم منطق التفويض لنموذج Eloquent محدد. ويُنصح باستخدام Policies عندما يكون لديك عدة إجراءات للتفويض على النموذج نفسه.

إنشاء Policy

استخدم Artisan لإنشاء Policy. أضف --model لملء الطرق القياسية مسبقًا.

$ php artisan make:policy PostPolicy --model=Post

طرق Policy

تقابل كل طريقة إجراءً معينًا. وتتلقى المستخدم الذي تمت مصادقته ونسخة النموذج.

<?php
class PostPolicy
{
    public function view(?User $user, Post $post): bool
    {
        return $post->is_published || $user?->id === $post->user_id;
    }

    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id || $user->isAdmin();
    }
}

تسجيل Policies

في Laravel 11 والإصدارات الأحدث، يجري اكتشاف Policies تلقائيًا إذا اتبعت اصطلاحات التسمية (Post model → PostPolicy). ويمكنك أيضًا تسجيلها يدويًا في AuthServiceProvider.

استخدام Policies في وحدات التحكم

استدعِ $this->authorize("action", $model) — وسيعثر Laravel تلقائيًا على Policy المطابقة.

<?php
public function update(Request $request, Post $post): RedirectResponse
{
    $this->authorize("update", $post);
    $post->update($request->validated());
    return redirect()->route("posts.show", $post);
}

استخدام Policy في Blade

يعمل التوجيه @can مع Policies بالطريقة نفسها التي يعمل بها مع Gates.

@can('update', $post)
    <a href="/posts/{{ $post->id }}/edit">Edit</a>
@endcan

الطريقة before()

تُنفّذ الطريقة الاختيارية before() في Policy قبل الطرق الأخرى. أعِد true لمنح صلاحية وصول كاملة (مثلًا للمسؤولين).

<?php
public function before(User $user, string $ability): ?bool
{
    if ($user->isAdmin()) return true;
    return null; // continue to specific method
}

إجراء Create (من دون نسخة نموذج)

لا تتلقى طريقة Policy المسماة create سوى المستخدم (من دون نموذج)، لأنه لا توجد نسخة منه بعد.

<?php
public function create(User $user): bool
{
    return $user->hasVerifiedEmail();
}

التحقق من Policies يدويًا

استخدم واجهة Gate أو نموذج المستخدم للتحقق من Policies مباشرةً.

<?php
Gate::allows("update", $post);    // true/false
$user->can("update", $post);      // true/false
$user->cannot("delete", $post);   // true/false

استجابات Policy

أعِد كائن Response من طريقة Policy لتخصيص رسالة الرفض.

<?php
use Illuminate\Auth\Access\Response;

public function publish(User $user, Post $post): Response
{
    return $user->isEditor()
        ? Response::allow()
        : Response::deny("Only editors can publish posts.");
}

اختبار Policies

اختبر Policies بمحاكاة استخدام مستخدم محدد في PHPUnit.

<?php
public function test_owner_can_delete_post(): void
{
    $user = User::factory()->create();
    $post = Post::factory()->create(["user_id" => $user->id]);
    $this->assertTrue($user->can("delete", $post));
}

الملخص

تجمع Policies التفويض على مستوى النموذج. أنشئها باستخدام make:policy --model. استخدم $this->authorize() في وحدات التحكم و@can في Blade. استخدم before() لتجاوز التفويض للمسؤولين.

تحقق سريع

أي طريقة في Policy لا تتلقى سوى المستخدم من دون نسخة نموذج؟

الأسئلة الشائعة

هل درس «Policies: التفويض القائم على النماذج» مجاني؟

نعم — نص درس «Policies: التفويض القائم على النماذج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.

ماذا ستتعلم في «Policies: التفويض القائم على النماذج»؟

اربطوا Policies بنماذج Eloquent واستخدموها في وحدات التحكم تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟

لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «Policies: التفويض القائم على النماذج»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟

نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المصادقة باستخدام Laravel Breeze
  2. حماية المسارات باستخدام Middleware
  3. Gates: عمليات تحقق بسيطة من التفويض
  4. Policies: التفويض القائم على النماذج
← العودة إلى PHP Academy