未调用Laravel门方法

未调用Laravel门方法,laravel,authorization,Laravel,Authorization,在my Laravel 5.4应用程序中,用户可以创建项目,然后在这些项目中发布文章 我试图阻止用户在他们无权访问的项目中创建或编辑帖子。 为此,我实现了一个Gate,如下所述: 大门检查用户是否是项目的所有者 Gate::define('create-post', function ($user, $project) { Log::info($project) // !!! Never gets called return $project->owner_id == $u

在my Laravel 5.4应用程序中,用户可以创建项目,然后在这些项目中发布文章

我试图阻止用户在他们无权访问的项目中创建或编辑帖子。 为此,我实现了一个Gate,如下所述: 大门检查用户是否是项目的所有者

Gate::define('create-post', function ($user, $project) {
    Log::info($project) // !!! Never gets called
    return $project->owner_id == $user->id;
});
在PostController上,我调用Gate::拒绝将项目作为参数传递

if (Gate::denies('create-post', $project)) {
    abort(403);
}
问题是我为gate定义的代码从未被调用。相反,它总是返回false并返回403错误。 但是,如果我不将项目作为参数传递,代码确实会被调用,但这会使它毫无用处

我还想补充一点,在这种情况下,我不能使用策略,因为create方法只接受一个参数($user),如果我尝试传递$project,它将以与Gate相同的方式失败


这是虫子吗?有没有其他更好的方法来实现这个功能?谢谢。

我可以通过使用策略来修复它。我在ProjectPolicy中创建了以下方法:

public function createOrEditPosts(User $user, Project $project)
{
    return $project->owner_id == $user->id;
}
然后,我从PostController调用:

$this->authorize('createOrEditPosts', $project));

我仍然不知道为什么gate方法不起作用。

我也有同样的问题。当Gate::allows()中的第二个参数是一个雄辩的模型时,似乎发生了一些错误

如果传入拒绝()任何其他变量(即使是对象,但不是雄辩的模型),则Log::info()将起作用。 我浪费了一整天的时间在它上面,然后切换到$user->can()

我也遇到了同样的问题。 我将
Gate::denties()
替换为
Gate::allows()

我不知道为什么,但这对我很有效。诚实地说,策略框架有点棘手

首先,检查登录到项目,然后检查gate work,因为您登录到项目的gate when work。

虽然这可能是解决问题的一个有价值的提示,但一个好的答案也说明了解决方案。请提供示例代码来说明您的意思。或者,考虑把这个写为评论,我知道,我同意你的观点,但是这个暗示只是暗示,没有任何代码可以解决。因为有时候我们忘记登录,在检查了gate-allow功能后,laravel不知道站点中是什么类型的用户,所以
gate::alow
不起作用。