Laravel 策略最佳实践

Posted

技术标签:

【中文标题】Laravel 策略最佳实践【英文标题】:Laravel Policies Best Practices 【发布时间】:2020-08-29 20:31:24 【问题描述】:

我是 Laravel 的新手,我正在制作一个包含用户和帖子的迷你博客,每个人都可以看到帖子,每个用户都可以删除和更新他们自己的帖子,所以我使用授权策略。

在创建策略时,我意识到两者的代码(删除/更新)是相同的

public function update(User $user, Post $post)

    return $user->id === $post->user_id;


public function delete(User $user, Post $post)

    return $user->id === $post->user_id;

我应该保持这种方式还是应该只使用一种方法,因为它是多余的? 我的意思是,如果我只使用一种方法,我可以将它从 PostController 的构造函数中的一行应用到我想要的所有 Controller 方法


$this->middleware('can:policyMethodName, post')->except('show', 'index', 'create');

在 Laravel 中应用策略的最佳实践是什么?

【问题讨论】:

【参考方案1】:

这是编程的一般问题,而不是 Laravel 的特定问题。

从功能的角度来看,您将不得不问自己什么更有意义。如果您预计此博客将始终允许用户更新/删除他们自己的帖子,那么使用单个方法 canEditOrDelete 可能是有意义的。但是,在未来,例如,如果您认为您可能希望限制用户在 n 分钟内编辑帖子,那么您需要重新编程您的逻辑。希望这并不重要太多,因为您限制了引用此方法的次数。

如果你想真正看上它,你可以使用bit-based permissions。如果您以前没有使用过位操作,则需要一点时间来适应,但这相对来说是小菜一碟,并为您提供了更多的灵活性。

class Permissions 
    const CAN_EDIT = 1;
    const CAN_DELETE = 2;
    const CAN_EDIT_OR_DELETE = CAN_EDIT | CAN_DELETE; // in base-10, this is "3"


permissions($user, $post) & Permissions.CAN_EDIT_OR_DELETE; // returns true if user can edit or delete post.

【讨论】:

以上是关于Laravel 策略最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Laravel最佳实践--API请求频率限制(Throttle中间件)

在 laravel 中添加常量的最佳实践是啥? (长名单)

Laravel 形式的最佳实践?隐藏输入或路由参数?

Laravel 数据库日志 - 最佳实践是啥

Laravel 迁移 - 永远保留它们?啥是最佳实践?

Laravel 中批量更新关系的最佳实践