Как использовать метод 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');

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

🤔 А знаете ли вы, что...
Laravel поддерживает интеграцию с сторонними сервисами, такими как AWS и Google Cloud.


1
51
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 документации.