在Laravel 5中存储反向授权逻辑的位置?

时间:2018-01-16 01:58:45

标签: php laravel architecture

Laravel中的“直接”资源授权非常简单明了。您需要创建策略,在其中实现方法,注册策略并使用User::can方法检查授权:

class PostPolicy
{
    /**
     * Checks whether a user can view a post
     */
    public function view(User $user, Post $post)
    {
        return $user->id === $post->author_id || $user->group_id === $post->group_id;
    }
}

if (!$user->can('view', $post)) {
    abort(403);
}

但是“反向”授权呢?说“反向授权”是指获取用户被授权的资源。至于上面的示例,它正在获取用户可以查看的帖子:

function getPostsUserCanView(User $user)
{
    return Post::where('author_id', $user->id)->orWhere('group_id', $user->group_id)->get();
}

$posts = getPostsUserCanView($user);

getPostsUserCanView函数的逻辑放在Laravel应用程序中的适当或最佳位置是什么?你如何在你的应用程序中解决这个问题?

1 个答案:

答案 0 :(得分:2)

为此,您可以直接使用Relationships

Post模型中:

...
    public function posts()
    {
        return $this->hasMany('App\Models\Post', 'employee_id','user_id');
    }
...

然后你可以这样做:

public function getPostsUserCanView()
{
    $posts = auth()->user()->posts;
    return $posts;
}

auth()->user()为您提供登录用户,然后posts方法(定义{{​​1}}和User模型之间的关系)将收集所有帖子Post等于$author_id的{​​{1}}(在我的示例中为$primaryKey)。

放置逻辑

的位置

如果它是一个小应用程序,您可以将该逻辑直接存储在控制器中,但如果您想要解耦更多代码,您可以执行以下操作:

1 - 用户存储库:进行与数据库的所有交互。基本的CRUD功能。这会隔离应用程序使用的驱动程序以保留数据 2 - 用户服务:其中包含与用户相关的所有操作。此类可以调用存储库来修改数据,但也可以使用其他功能,如管理关系等。这可以避免控制器与模型交互 3 - 用户控制器:控制器基本上是应用程序的粘合剂,它调用不同服务(模型)的方法相互交互。

这样你的类只有一个目的。正如SOLID所述。