Laravel策略视图资源未触发

时间:2019-09-25 09:33:27

标签: laravel

我有这条路线:

Route::Resource('/additional_role_countries', 'AdditionalRoleCountryController');

在控制器中,我具有此授权:

class AdditionalRoleCountryController extends Controller
{
    public function __construct() {
        $this->authorizeResource(AdditionalRoleCountry::class, 'additional_role_countries');
    }
}

最后我对模型有了这个策略:

class AdditionalRoleCountryPolicy extends AbstractAuthorization
{
    use HandlesAuthorization;

    public function __construct()
    {
        var_dump('je suis dans le construct de la policy');
    }

    /**
     * Determine whether the user can view any additional role countries.
     *
     * @param  Member  $member
     * @return mixed
     */
    public function viewAny(Member $member)
    {
        //
    }

    /**
     * Determine whether the user can view the additional role country.
     *
     * @param  Member  $member
     * @param  AdditionalRoleCountry  $additionalRoleCountry
     * @return mixed
     */
    public function view(Member $member, AdditionalRoleCountry $additionalRoleCountry)
    {
        var_dump('titi');
        return true;
    }

    /**
     * Determine whether the user can create additional role countries.
     *
     * @param  Member  $member
     * @return mixed
     */
    public function create(Member $member)
    {
        return $this->isAuthorizedBranch($member);
    }
}

我的问题:

对于POST(=创建),一切运行良好。如有必要,它将发送403错误。

但要GET(=视图)。它不起作用。它甚至从不执行__construct方法。它直接返回 403

我不明白为什么。谢谢你的帮助。谢谢

编辑

我试图更改此内容:

$this->authorizeResource(AdditionalRoleCountry::class, 'additional_role_countries');

与此:

$this->authorizeResource(AdditionalRoleCountry::class);

现在看来,它适用于帖子和获取。这是否意味着第二个参数不是必需的?

1 个答案:

答案 0 :(得分:1)

它不起作用,因为您将错误的路由参数传递给了authorizeResource

Route::resource('additional_role_countries')生成以下路由参数

additional_role_country 

但您正在通过

additional_role_countries 

问题是Laravel找不到与additional_role_countries相对应的模型,但仍运行can检查,但默认情况下返回false(403)。


解决方案

删除第二个参数或将其更改为additional_role_country应该可以解决问题。

$this->authorizeResource(AdditionalRoleCountry::class, 'additional_role_country');

$this->authorizeResource(AdditionalRoleCountry::class);


为什么它适合您的商店请求

如您所见,here Laravel并未对方法indexcreatestore使用第二个参数,而是使用了来自第一个参数的类名,在您的情况下为AdditionalRoleCountry