Как использовать метод can() для маршрутов обновления?

Я прочитал здесь, что в Laravel мы можем использовать метод can вместо традиционного вызова промежуточного программного обеспечения на маршруте. https://laravel.com/docs/11.x/authorization#middleware-actions-that-dont-require-models

use App\Models\Post;
 
Route::post('/post', function () {
    // The current user may create posts...
})->can('create', Post::class);

Теперь традиционный метод для промежуточного программного обеспечения выглядит так:

Route::post('/post', function () {
    // The current user may create posts...
})->middleware('can:create,App\Models\Post');

Мне очень нравится этот метод can, и было бы неплохо иметь возможность заменить вызовы промежуточного программного обеспечения для обновления, чтобы они были последовательными:

use App\Models\Post;
Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->middleware('can:update,post');

Есть ли способ сделать это? В документации ничего по этому поводу нет...

Почему это ваша основная цель? Используете ли вы какой-нибудь класс Policy? С помощью can вы можете авторизовать действия пользователя по отношению к вашим ресурсам БД. Но для использования can вам нужен класс Policy.

Subha 21.08.2024 19:05

@Subha Моя цель — использовать класс Policy с методом can маршрута вместо использования метода промежуточного программного обеспечения.

inf3rno 21.08.2024 20:07

Я опубликовал свой подробный подробный ответ, пожалуйста, проверьте и дайте мне знать ваш отзыв.

Subha 21.08.2024 20:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование метода can для обновления маршрутов

use App\Models\Post;

Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->can('update', 'post');

->can('update', 'post'): определяет применяемую политику авторизации. Здесь 'update' — метод политики, а 'post' — параметр, передаваемый этому методу. Laravel автоматически внедрит экземпляр модели из параметра маршрута и выполнит проверку авторизации.

В вашем PostPolicy у вас должен быть такой метод:

public function update(User $user, Post $post)
{
    // Authorization logic to determine if the user can update the post
    return $user->id === $post->user_id;
}
Ответ принят как подходящий

Есть несколько шагов, которые вам нужно выполнить.

Создайте и зарегистрируйте свой Policy класс.

С помощью этой команды создайте класс Policy. Сгенерированная политика будет размещена в каталоге app/Policies.

php artisan make:policy PostPolicy --model=Post

Этот класс выглядит так.

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    /**
     * Determine whether the user can update the post.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Post  $post
     * @return mixed
     */
    public function update(User $user, Post $post)
    {
        // Example: Only allow the user to update their own post
        return $user->id === $post->user_id;
    }
}

Затем зарегистрируйте policy-class в методе boot вашего приложения AppServiceProvider вот так.

use App\Models\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Gate::policy(Order::class, OrderPolicy::class);
}

И, наконец, вы можете использовать can в маршруте, чтобы использовать этот PostPolicy класс вот так.

use App\Models\Post;

Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->can('update','post'); //here `post` is an instance of `App\Models\Post` model

Н:Б :-

  1. Модель Post должна иметь foreign-key имя user_id, по которому update будет сопоставлена ​​авторизация. Если подходящих пользователей не обнаружено, будет возвращен HTTP-ответ со статусом 403.
  2. Для получения дополнительной информации ознакомьтесь с официальной документацией о том, как создать и зарегистрировать Policy
  3. Проверьте раздел Generating Policies и Registering Policies документации.

Обратите внимание: согласно документации вам не нужно регистрировать политики вручную, если вы соблюдаете соглашение об именах. X -> XPolicy и файл php находится в папке Policies.

inf3rno 22.08.2024 10:40

@ inf3rno, да, верно, и это упоминается в документации. 1-я фраза раздела Policy Discovery документации объясняет это.

Subha 22.08.2024 10:57

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