Как автоматически зарегистрироваться и использовать политики в Laravel 11?

Я создаю политику для модели todo, чтобы авторизовать роль пользователя, а затем установить индивидуальный доступ для функций модели, таких как create(), update() и т. д. Как написано в документации Laravel, мы можем создать политику для модели todo с помощью php artisan make:policy todoPolicy --model=todo.

Когда мы используем имя модели + Политика в качестве имени нашей политики, которая находится в папке App\Policies, Laravel автоматически регистрирует их для модели, как мы использовали todoPolicy для модели todo.

Кроме того, чтобы проверить, работает эта политика или нет, я установил return true; для функции create() в файле todoPolicy и вызываю $this->authorize('create,' todo::class); в функции добавления компонента для ее тестирования.

Но всегда возвращает 403, а не авторизованную страницу. В чем проблема с моим кодом?

Компонент/контроллер

namespace App\Livewire\Elements\Todolist;

use Livewire\Component;
use App\Models\todo;

class Todolist extends Component
{
    public $description;

    public function done($id) {
        sleep(0.5);
        todo::where('id',$id)->first()->update([
            'is_done' => true,
        ]);
    }

    public function restore($id) {
        sleep(0.5);
        todo::where('id',$id)->first()->update([
            'is_done' => false,
        ]);
    }

    public function delete($id) {
        sleep(0.5);
        todo::where('id',$id)->first()->delete();
    }

    public function add(todo $todo) {
        $this->authorize('create',$todo);
        
        $this->validate([
            'description' => ['required','max:128'],
        ]);
        sleep(0.5);
        todo::create([
            'user_id' => session('user_id'),
            'description' => $this->description,
        ]);
        $this->reset();
    }

    public function render()
    {
        return view('livewire.elements.todolist.todolist',[
            'todos' => todo::orderBy('is_done','ASC')->orderBy('created_at','DESC')->get(),
        ]);
    }
}

TodoPolicy

namespace App\Policies;

use App\Models\User;
use App\Models\todo;
use Illuminate\Auth\Access\Response;

class todoPolicy
{
    /**
     * Determine whether the user can view any models.
     */
    public function viewAny(User $user): bool
    {

    }

    /**
     * Determine whether the user can view the model.
     */
    public function view(User $user, todo $todo): bool
    {

    }

    /**
     * Determine whether the user can create models.
     */
    public function create(User $user): bool
    {
        return true;
    }

    /**
     * Determine whether the user can update the model.
     */
    public function update(User $user, todo $todo): bool
    {
        //
    }

    /**
     * Determine whether the user can delete the model.
     */
    public function delete(User $user, todo $todo): bool
    {
        //
    }

    /**
     * Determine whether the user can restore the model.
     */
    public function restore(User $user, todo $todo): bool
    {
        //
    }

    /**
     * Determine whether the user can permanently delete the model.
     */
    public function forceDelete(User $user, todo $todo): bool
    {
        //
    }
}

Я пробовал регистрировать политики вручную, но это ничего не изменило.

Я подозреваю, что ваша проблема в капитализации. Модель по имени todo будет искать todoPolicy; вам следует использовать соглашения об именах Laravel как для файлов, так и для классов (App\Models\Todo и app/Models/Todo.php), особенно если вы будете размещать хостинг в Linux (как это делает большинство людей).

ceejayoz 11.04.2024 14:29

@ceejayoz Я внес изменения, но все равно не работает

Mehdi 11.04.2024 15:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
1 138
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема заключалась в том, что когда мы хотим return true; использовать функцию политики без передачи ей моделей, нам следует сделать модель необязательной, например:

public function create(?User $user): bool
{
    return true;
}

Это так важно, особенно когда вы не используете систему аутентификации Laravel.

Мне потребовалось некоторое время, чтобы найти его, но, покопавшись в пакете laravel, я обнаружил, что политики должны находиться внутри папки моделей.

Таким образом, пространство имен для вашего класса политики должно быть namespace App\Models\Policies;

Вы можете сделать и то, и другое: сначала Laravel ищет политики внутри App\Models\Policies, затем ищет внутри App\Policies

Mehdi 22.04.2024 16:41

попробуй это. в laravel 11 удалили AuthServiceProvider. Поэтому вам придется сделать это в AppServiceProvide, чтобы зарегистрировать его вручную.

https://laravel.com/docs/11.x/authorization#manually-registering-policies

Я не хотел использовать аутентификацию Laravel, это тоже 11

Mehdi 14.06.2024 16:31

Другие вопросы по теме