当前位置: 首页 > 后端技术 > PHP

基于模块的LaravelAPI架构

时间:2023-03-30 00:57:34 PHP

转自PHP/Laravel开发者社区https://laravel-china.org/top...我很喜欢基于模块化设计编写软件和编程方法,但我不会喜欢依赖第三方包和库来处理琐碎的事情,因为它们不会很好地提高你的编程水平。所以两年来我一直在用Laravel编写基于模块的软件,我对结果非常满意。推动我走向基于模块化设计的软件和编程的决定性因素是我想不断提高我的编程技能。假设您构建了一个项目结构,6个月后您发现该项目存在很多错误。在不影响6个月的现有代码的情况下更改项目的体系结构通常并不容易。在分析这个项目时,我注意到两个要点:要么整个项目都有一个标准并坚持下去,要么模块化,逐个模块改进。有些人倾向于通过不惜一切代价坚持标准来发展,即使这可能意味着坚持您不再喜欢的标准。就个人而言,我更喜欢持续改进,第20个模块是否与第1个模块完全不同也没有关系。如果有一天我需要回到模块1来修复错误或重构,我可以将其改进到第20个模块使用的最新标准。假设你和我一样,也喜欢基于模块化开发Laravel应用,尽可能避免在项目中加入不必要的第三方依赖——这篇文章是我的一点心得。1-路由服务提供者Laravel路由系统可以说是整个应用的入口。首先要修改的是默认的RouteServiceProvider.php文件,它应该模块化现有的路由。mapModulesRoutes();}protectedfunctionmapModulesRoutes(){//如果您正在编写传统的Web应用程序而不是HTTPAPI,请使用`web`中间件。Route::middleware('api')->group(base_path('routes/modules.php'));}}如上,我们可以直接去掉这个文件的整个样板,只设置一个模块化的路由文件。2-模块文件Laravel在routes文件夹中附带了一些文件。由于我们不再在RouteServiceProvider中映射这些路由,我们可以直接删除它们。接下来,我们创建一个modules.php路由文件。paginate());}}上面代码中的BookResource是Laravel的资源转换层。按照官方对命名空间的建议,我们可以在app/Modules/Books/Resources文件夹中创建它。$this->resource->id,'title'=>$this->resource->title,];}}4-Authors模块我们也可以通过Routes文件启动Authors模块。paginate());}}最后,我们将编写的Resource类转换为响应式JSON格式。$this->resource->id,'name'=>$this->resource->name,'books'=>$this->whenLoaded('books',function(){returnBookResource::collection($this->resource->books);})];}}请注意资源如何进入另一个模块以重用BookResource。这通常不是一个好的选择,因为模块应该是完全自给自足的,并且只重用标准类,例如Eloquent模型或设计为在任何模块中通用的通用组件。这个问题的解决方案通常是将BookResource复制到Authors模块中,这样就可以在不使用另一个模块的情况下对其进行更改,反之亦然。我决定保留这种跨模块用法,这个例子展示了一个很好的经验法则来保持模块彼此隔离,但是如果你认为上面的例子很简单并且不太可能引起任何问题。始终确保编写测试以涵盖您编写的功能,以避免其他人在不知不觉中修改您的应用程序。5-结论虽然这是一个非常简单的示例,但我希望它能让人们根据自己的需要轻松地使用Laravel框架来操作结构标准。您可以非常轻松地更改文件的位置以构建基于模块化的应用程序。我的大部分项目都带有App/Components模块,可用于任何模块的可重用泛型基类;App/Eloquent,Modules文件夹可以用来存放Eloquent模型和数据库关系模型,我们可以在其中构建任何基于模块的功能。这是我最近开始做的一个应用程序的文件夹目录结构:希望大家能从中得到概念,每个模块都有自己的需求,可以有自己的文件夹/实体/类/方法/属性。没有必要将所有模块标准化为完全相同,因为一些模块比其他模块简单得多,不需要大量的结构设计。此示例显示AccountChurn模块通过HTTP文件夹提供API,同时仍通过控制台提供Artisan命令。另一方面,AccountOverview仅提供HTTPAPI,并依赖存储库、值对象(包)和服务类(分页器)来提供更大的数据价值。