Я прочитал здесь, что в 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');
Есть ли способ сделать это? В документации ничего по этому поводу нет...
@Subha Моя цель — использовать класс Policy с методом can маршрута вместо использования метода промежуточного программного обеспечения.
Я опубликовал свой подробный подробный ответ, пожалуйста, проверьте и дайте мне знать ваш отзыв.






Использование метода 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.PolicyGenerating Policies и Registering Policies документации.Обратите внимание: согласно документации вам не нужно регистрировать политики вручную, если вы соблюдаете соглашение об именах. X -> XPolicy и файл php находится в папке Policies.
@ inf3rno, да, верно, и это упоминается в документации. 1-я фраза раздела Policy Discovery документации объясняет это.
Почему это ваша основная цель? Используете ли вы какой-нибудь класс
Policy? С помощьюcanвы можете авторизовать действия пользователя по отношению к вашим ресурсам БД. Но для использованияcanвам нужен классPolicy.