ioannisloukeris/laravel-never-crud

再也不在 Laravel 项目中写 CRUD... 或者接近这个...

v1.1.4 2023-10-18 10:46 UTC

This package is auto-updated.

Last update: 2024-09-18 13:04:41 UTC


README

再也不在项目中使用 Laravel 写 CRUD 代码... 或者尽可能接近这个...

范围

这是一个辅助包,旨在自动化 Laravel 项目的 CRUD 编写。CRUD 非常重复,95% 的时间你都在重复做同样的事情

  • 获取输入
  • 验证输入
  • 根据输入做某些工作,这将是以下之一
    • 创建
    • 更新
    • 删除
    • 复制
    • 更改动态属性
  • 返回结果(有时是新的对象、ID、状态或错误/异常)NeverCRUD 设计用于自动化所有这些任务,以至于你只需编写两个包含验证元数据的 PHP 数组,一个用于创建输入验证,另一个用于更新输入验证,因为它们通常不同。如果你在这种情况下它们是相同的,那么太幸运了,你只需写一个。

它是否僵化?会不会让我感到沮丧?

不。你可以随心所欲地进行定制。CRUD 的每个方面都可以被覆盖。你甚至不需要在项目的所有方面都使用它...

它是魔法吗?

不。

它有局限性吗?

当然。如果你的项目有非常复杂的要求,你可能最终会做比从头开始实现 CRUD 更多的工作。这不是万能药,你必须思考和决定。

有陷阱吗?

是的...和不是。

你能更具体一些吗?

嗯...如果你使用 CRUDController 的 MVC 版本(CRUDControllerMVC),一切都是你所熟悉的。如果不...我们可能会改变 Laravel 的整个 MVC 规范,并将其扩展到更复杂的东西。这一切可能听起来像是一件大事,但实际上不是。至少在你理解为什么 这个包 的非 MVC 版本被创建以及它打算帮助你做什么之后。 我们正在开发一个版本,它不会这样做,但到目前为止这似乎有点无聊。它将在我们让它变得不那么无聊后包含在包中。 MVC 版本包含在 1.1.x 中,你可以随意使用它。

你不是在非 MVC 版本中干涉你不应该干涉的事情吗?

可能是。

你真的认为你比 Laravel 的创建者和维护者更懂吗?

不。我们当然不。这个包对你来说不一定有用。如果你只是用 Laravel 制作网站,那么有相当大的可能性你并不需要这个。另一方面,如果你正在制作一个包含业务逻辑并提供 API(可选地还有一个网站)的系统,那么这绝对是一样可能会对你有益的东西。在第一种情况下,使用 MVC 版本来加速原型设计和开发。在第二种情况下,你被鼓励深入了解并使用非 MVC 版本。

好吧,我现在完全迷失了,你能请停止开玩笑,并确切地解释这是做什么和如何做的吗?

当然。

嗯?

好的。Laravel使用MVC模式。模型用于访问和操作数据。视图用于在预制的模板中显示它们,控制器用于将数据填充到视图中。这是经典的做法。CRUDControllerMVC也遵循这个模式。NeverCRUD(CRUDController/CRUDHandler/ModelDataService的组合)改变了这一点。我们引入了处理器的概念,它们实际执行工作,并将清理输入的责任留给控制器。 警告 安全性是你的责任。清理和验证输入只是 部分 安全性,并由NeverCRUD派生的控制器自动处理。 但这并不意味着你是安全的! 其他所有关于安全的事情都是 你的 责任。处理器(由NeverCRUD处理器派生)包含业务逻辑。处理器不直接操作数据。 请不要作弊。NeverCRUD引入了数据服务的概念。一个包含的数据服务是ModelDataService,它使用模型来完成其工作。在规划中,我们有CachedModelDataService,它包括使用缓存。另一个正在开发中的是APIDataService。它做什么,留给你去想象。

为什么要做所有这些?处理器?数据服务?有什么好处?

想象以下场景

  • 你正在为保险公司构建一个系统。
  • 你需要以几种接口展示你的数据
    • 一个供公司员工使用的接口
    • 一个供公司代理商使用的接口
    • 一个供全世界所有人的网页接口
    • 它有一个为需要查看其保单和付款的保险持有人预留的区域
    • 一个为保险持有人手机上的原生应用程序。
  • 每个接口都需要不同的功能集和安全问题。
  • 由于我们也是平台公司,这个系统需要是可定制的...
  • 该系统需要从外部来源获取数据,如地址验证、信用评分数据和风险评估服务。并非所有数据都来自或流向你的数据库。因此需要数据服务。你需要做很多事情,这些事情可能或可能不重叠在每个接口之间,你绝对不能将所有事情都放在一个控制器中。因此需要处理器。最后,这是一个庞大的系统,需要健壮性和扩展性等,并且足够多样化,需要微服务。为每个模型在每个微服务中编写crud是非常繁琐且容易出错的。因此需要自动化的CRUD。

看起来架构方面也很重要...

根据你所做的工作,这非常重要。我已经研究了DDD和其他架构相关的东西几年了,这可能会成为一种新的范式或DDD的变体。目前,让我们假设这只是一个CRUD缓解包 :-)

版本控制

始终使用你开始的主版本的最新版本。我们预计未来不会有破坏性的变化,因此所有1.x.x版本都应该是先前版本的替代品。破坏性变化将通过主版本号的增加来表示。所以对于这个项目

  • 1.x.x <- 只有在项目中有破坏性变化时才增加主版本号
  • x.1.x <- 子版本号,表示当前的功能。将在添加新功能时增加。
  • x.x.1 <- 次版本号。将在修复错误、类型、非功能添加或代码质量重构时增加。例如,将此段落添加到readme.md文件的更改将使版本从v1.0.3增加到v1.0.4。当(如果)添加动态属性时,版本将从v1.0.x增加到1.1.x。升级到那个版本不会破坏你的代码。保证。

示例?教程?

太懒了。如果有足够的兴趣,我会做的。 我已经让我的懒屁股写了一个示例,你可以在这里找到

LaravelNeverCRUD-example