0Pricing
PHP Academy · Урок

Политики: авторизация на основе моделей

Привязывайте политики к моделям Eloquent и используйте их в контроллерах

«Политики: авторизация на основе моделей» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Что такое политика?

Политика — это класс, который организует логику авторизации для конкретной модели Eloquent. Политики рекомендуются, когда для одной модели предусмотрено несколько действий авторизации.

Создание политики

Используйте Artisan, чтобы сгенерировать политику. Добавьте --model, чтобы предварительно заполнить стандартные методы.

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

Методы политики

Каждый метод соответствует действию. Он получает аутентифицированного пользователя и экземпляр модели.

<?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();
    }
}

Регистрация политик

В Laravel 11 и новее политики обнаруживаются автоматически, если они соответствуют соглашениям об именовании (модель Post → PostPolicy). Также их можно зарегистрировать вручную в AuthServiceProvider.

Использование политик в контроллерах

Вызовите $this->authorize("action", $model) — Laravel автоматически найдёт соответствующую политику.

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

Политика в Blade

Директива @can работает с политиками так же, как со шлюзами.

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

Метод, выполняемый до остальных

Необязательный метод политики before() выполняется до остальных методов. Верните true, чтобы предоставить полный доступ (например, администраторам).

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

Действие создания (без экземпляра модели)

Метод политики create получает только пользователя (без модели), поскольку экземпляр ещё не существует.

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

Ручная проверка политик

Используйте фасад Gate или модель пользователя, чтобы напрямую проверять политики.

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

Ответы политик

Возвращайте объект Response из метода политики, чтобы настроить сообщение об отказе.

<?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.");
}

Тестирование политик

Тестируйте политики в 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));
}

Итоги

Политики объединяют авторизацию на уровне моделей. Создавайте их с помощью make:policy --model. Используйте $this->authorize() в контроллерах и @can в Blade. Применяйте before() для обхода проверок администраторами.

Быстрая проверка

Какой метод политики получает только пользователя, без экземпляра модели?

Часто задаваемые вопросы

Урок «Политики: авторизация на основе моделей» бесплатный?

Да — полный текст урока «Политики: авторизация на основе моделей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «Политики: авторизация на основе моделей»?

Привязывайте политики к моделям Eloquent и используйте их в контроллерах Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Политики: авторизация на основе моделей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Аутентификация с Laravel Breeze
  2. Защита маршрутов с помощью промежуточного ПО
  3. Gates: простые проверки авторизации
  4. Политики: авторизация на основе моделей
← Назад к PHP Academy