Я прочитал здесь, что в 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.
Использование метода 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
Н:Б :-
Post
должна иметь foreign-key
имя user_id
, по которому update
будет сопоставлена авторизация. Если подходящих пользователей не обнаружено, будет возвращен HTTP-ответ со статусом 403.Policy
Generating Policies
и Registering Policies
документации.