Laravel 5模型验证和授权


Laravel 5 model validation and authorization

我正面临着如何在我的laravel项目中实现验证的困境,让我解释一下情况。

  1. 我正在使用angular JS前端用户界面,并使用restful资源控制器与laravel通信。
  2. 我在控制器的store()update()方法中使用表单请求验证,通过rules()方法验证数据,并使用authorize()方法确定授权,这确保了我的数据是正确的,只有具有正确权限级别的用户才能添加/编辑数据。只要数据是通过向api发出的表单/ajax请求来的,此时一切都运行良好。

现在,问题来了。有时插入/编辑操作需要以编程方式完成,例如,每当在表a中创建一行时,需要在表B中创建一行,但在这样做之前,它还应该运行相同的验证规则并检查授权,如果表B是使用表单请求创建的,但如果我只是调用说TableA::Create([])行将在没有任何验证的情况下创建。

当然,我也可以在模型中使用Validator::make(),但是,A)它使模型混乱b)是代码的重复

因此,我的目标是确保无论表A的记录如何进入数据库,如果它是从应用程序完成的,检查将在保存数据之前执行,同时保持验证和授权规则的中心。在我看来,要走的路是把一个挂钩到模型的"保存"事件,并以某种方式触发表单请求验证器?但我不确定。

我看到了Jeffrey Way的自动模型验证器,但那是针对Laravel 4的。在Laravel 5中有什么优雅的方法来做到这一点吗?x ?

另外,作为一个附加问题,当我在其他地方问这个问题时,一些人说他们"不是基于模型的验证的粉丝",没有解释为什么这对他们来说不是一个好主意,所以我也想知道基于模型验证的缺点是什么?

我建议你后退一步。有一种尝试抽象所有内容的诱惑,这样就不会重复任何一行逻辑,但你需要理解为什么/你在这里验证什么。

在开发应用程序的早期阶段,您可能会觉得您在所有中重复验证逻辑,并且可能担心如果将验证放在控制器中会错过某些内容-例如,"如果我添加一个控制器方法并且在更新模型之前未能验证数据会发生什么?"。因此,接下来的自然步骤是将验证推入模型。

但是!您应该回去考虑您正在验证的内容。您在控制器中验证的并不总是与您在模型中验证的相同。

有关MVC验证的更多信息,请参阅Stacks姊妹网站上的以下链接:https://softwareengineering.stackexchange.com/questions/97880/in-mvc-should-a-model-handle-validation

在我看来,陷阱在于在开发的早期阶段,控制器和模型验证非常相似,您可能会认为它们是相同的。之所以会出现这种情况,是因为您自然会从一些简单的模型开始。您刚刚(在控制器中)验证了用户的名字不是"_-_kablamo!"-_-",那么在模型中你正在做同样的事情。

当您越过简单的用户模型时,您会发现您的模型和控制器更加复杂,并且验证可能不仅仅依赖于当前请求数据-例如,它可能依赖于系统中的其他数据,一年中的时间,季节,如果月亮是排列的。

我听到你尖叫好吧,这并没有真正帮助第一段,你说"如果我错过了一些新的控制器方法的验证会发生什么?"我的答案很简单,测试。你的单元测试应该能立即发现这一点。

No。

这是一个严重的问题,已经讨论了太多,却没有足够的解决方案。

Laravel假设你可以在前端、路由、控制器或模型进行验证,但代码的架构假设大多数用户将在更靠近用户的地方进行验证——要么在路由处,要么在控制器处——而不是在模型中。这对于简单的解决方案来说是可以的。当模型可以被多个具有不同职责的控制器使用时,这是不合适的。

模型需要作为规则和验证的单一权威点。
控制器和路由可以根据需要应用额外的验证。

从40年的经验来看,你拥有的功能越多,你拥有的开发人员越多,你的数据对财务的影响就越大,有人可能会起诉你,你的验证就越需要在后端执行。您的应用程序越小,开发人员越少,您的信息越不重要,您的信息将在前端附近得到更多的验证。

然而,通常你在路由、模型、控制器和数据库上为不同的目的进行验证。(上面有人说的)

"测试会抓住它"是对这个问题的一种千禧(贬义)回答。要么你的业务规则是声明性的和可观察的,要么它们不是声明性的和"神奇的"。杰瑞德有点…声明性和可观察性之间的奇怪关系。

有各种各样的软件包过去工作得很好,但我不确定现在是否有效。

1。laravel-ardent/热心的

2。莫蒂默/辛酸的

3。jaspaul/eloquent-model-validation

最简单的答案是创建一个基类,它覆盖保存函数,执行验证,捕获任何错误,并将它们添加到bucket中。

就我个人而言,我不知道为什么"殷切"不只是"做的方式"。不幸的是,作者似乎没有让它继续下去。