我想询问其他关于 Laravel 应用程序业务逻辑代码结构的意见,主要是关于行级别的权限。
对于那些不知道的人,Laravel 是一个 PHP 的 MVC 框架,很像 Rails。
为了便于理解,让我们假设一个多租户应用程序,其中每个用户都有自己的相册和图片,到目前为止一切正常。
- 现在,每个用户都可以邀请其他人协作(通过上传照片)到他的相册中。
- 上传图片的相册所有者和合作者都可以删除或更新有关该图片的信息。
- 只有所有者可以编辑相册并邀请新的协作者。
- 如果合作者愿意,他们可以将自己从相册中删除。
Pinterest 应该是类似的一个很好的例子,但我们的应用程序可能要复杂 3 到 4 倍。问题是:我应该在哪里处理这种逻辑?
Laravel 提出了拥有存储库、实体和服务的方法,我不完全理解,可能是因为缺乏好的例子。因此,满足这些最后期限的明显首选是将所有内容都放在控制器上(ew!)。现在,深入研究重构,有很多可能的方法可以使我们的代码不“意大利面”:
- 我见过人们在行级别实现 ACL(看起来有点愚蠢和矫枉过正)
- 可以将模型转变为行为感知对象,而不仅仅是数据容器,例如
$album->add_photo($photo)
并检查该功能的权限 - 也可以覆盖模型的保存方法并在那里进行这些检查
- 或者,遵循 Laravel 提出的具有独立关注层的道路
我想拥有类似的方法$album->can_be_edited_by($user)
可以简化在不允许的路线上显示 404 错误、隐藏视图的链接以及在保存模型之前进行验证
您会推荐哪一个,是否有人知道不使用 .NET 的存储库、实体和服务的任何简单但易于理解的示例?谢谢!
编辑:我猜一个完整的 ACL 系统会导致过多的开销,因为每个用户可能有数千个资源关联,但每种关联只有一个角色。例如,图片有一个uploader_id
,相册有一个owner_id
。