Laravel UserPolicy 在没有模型的情况下无法正常工作

问题描述 投票:0回答:1

我正在使用 Laravel 11.36.1,当我尝试在没有模型的策略方法中获取授权状态时(如文档所解释的),它总是返回“false”。我试着放一个

dd('hello world')
看看它是否显示不同的东西,但它不起作用。

用户政策

<?php

namespace App\Policies;

use App\Models\User;

class UserPolicy
{
    public function create(User $user): bool
    {
        dd('hello word', $user->id);
    }
}

我正在测试什么

User::find(2)->can('create'); // Returns `false`
User::find(2)->can('create', User::find(5)); // Returns the dd with `hello world` and `2`
User::find(2)->can('create', User::class); // Returns `false`
User::find(2)->can('create', new User); // Returns the dd with `hello world` and `2`

// Test in Pest
test('example', function() {
    $user = \App\Models\User::factory()->create();

    $this->actingAs($user);

    dd(
        auth()->user()->can('create') // Returns `false`
    );
});

我在期待什么

User::find(2)->can('create'); // Returns `hello world` and `2`

一些注意事项

  • 我也在使用 Spatie 的
    Laravel Permission
    (v6.9)。
  • 我尝试将
    Gate::policy(User::class, UserPolicy::class)
    放入
    AppServiceProvider.php
    的启动方法中,没有任何区别。
  • 使用
    User::find(2)->can('create', new User)
    既不是一个最佳的、可维护的和美观的解决方案,所以我放弃了它。
  • 也许我误解了 Laravel 中的策略和授权是如何工作的,但我厌倦了搜索,而且老实说我没有找到任何解释。
php laravel laravel-11 laravel-gate
1个回答
0
投票

我解决了这个问题。 在 Laravel 文档中解释说,如果该能力不需要模型,则需要传递对父模型的引用(在我的例子中是用户模型)。

use App\Models\User;

User::find(2)->can('create', User::class); // It works now!
© www.soinside.com 2019 - 2024. All rights reserved.