资讯专栏INFORMATION COLUMN

基于 Module 的 Laravel API 架构

gougoujiang / 3288人阅读

摘要:在不影响个月现有代码的情况下,通常不会轻易改变项目架构。此示例显示模块通过文件夹提供,同时仍通过控制台提供命令。另一方面,则仅提供,并且依赖仓库值对象以及服务类来提供更大的数据价值。

转自 PHP / Laravel 开发者社区 https://laravel-china.org/top...

我非常喜欢编写基于模块化设计的软件和编程方式,但我不太喜欢依赖第三方软件包和类库来处理一些琐碎的事情,因为它们不会让你的编程水平得到很好的提升。所以这两年来,我一直在用Laravel编写基于模块的软件,现在我对这个结果非常满意。

推动我走向基于模块化设计的软件和编程方式的决定性因素是我想持续提升我的编程水平。想象一下,你构建了一个项目结构,6个月后你发现这个项目存在很多bug。在不影响6个月现有代码的情况下,通常不会轻易改变项目架构。在分析这个项目时,我注意到了两个要点:你要么在整个项目中都有一个标准,要么坚持下去,要么模块化并逐个模块地改进。

有些人倾向于不惜一切代价、固守标准地开发,即使这可能意味着要坚持一个你不再喜欢的标准。就我个人来言,我更喜欢持续地改进,若是第 20 个模块和第 1 个模块写得完全不一样也没关系。如果某天我需要回到模块 1 修复 BUG 或重构,我可以将其改进为第 20 个模块使用的最新标准。

假设,你也像我一样喜欢基于模块化开发 Laravel 应用、尽可能避免在项目中添加不必要的第三方依赖——本文是我的一点经验。

1- 路由服务提供者

Laravel 路由系统可以说是整个应用的入口。首先需要修改的是默认的 RouteServiceProvider.php 文件,它应当将现有路由模块化。

mapModulesRoutes();
    }
    protected function mapModulesRoutes()
    {
        // 如果你在编写传统 Web 应用而非 HTTP API,请使用 `web` 中间件。 
        Route::middleware("api")
             ->group(base_path("routes/modules.php"));
    }
}

如上,我们可以直接摆脱该文件的整个样板,只需设置一个模块化的路由文件即可。

2- 模块文件

Laravel 在 routes 文件夹中自带了一些文件。由于我们已经不在 RouteServiceProvider 中映射这些路由,所以可以直接删除它们。接下来,我们创建一个 modules.php 路由文件。


3- Books 模块

在 app 文件夹中,创建 Modules/Books/routes.php 文件。在此文件中,我们可以定义该应用 Books 模块的路由规则。


你可以使用基于控制器——也就是 Laravel 中默认标准的路由方式,但我个人更喜欢 Good bye controllers, hello Request Handlers(放弃控制器,采用请求处理器) 的方式。 如下是 ListBooks 的实现。

paginate());
    }
}

以上代码中 BookResource 是 Laravel 的资源转换层。按照官方对于命名空间的建议,我们可以在 app/Modules/Books/Resources 文件夹中创建它。

 $this->resource->id,
            "title" => $this->resource->title,
        ];
    }
}
4- Authors 模块

我们还可以通过 Routes 文件来启动 Authors 模块。


注意:  app/Modules/Authors 这个命名空间正表示我们所编写的文件,对于请求处理程序来说也是非常简单的。

paginate());
    }
}

最后,我们将编写的 Resource 类转变为响应式的 JSON 格式。

 $this->resource->id,
            "name" => $this->resource->name,
            "books" => $this->whenLoaded("books", function () {
                return BookResource::collection($this->resource->books);
            })
        ];
    }
}

注意资源是如何进入另一个模块以重用 BookResource 。 这通常不是一个比较好的选择,因为模块应该是完全自给自足的,并且只能重用标准类,例如 Eloquent Models 或设计用于在任何模块上通用的通用的组件。 这个问题的解决方案通常是将 BookResource 复制到 Authors 模块中,从而可以在不使用另一个模块的情况下进行更改,反之亦然。 我决定保留这个跨模块的用法,这个例子表现出一个很好的经验方法,就是让模块之间彼此隔离,但是如果你认为上面的例子很简单并且不太可能带来任何问题。 始终确保编写测试以涵盖您编写的功能,以避免其他人在不知不觉中修改您的应用程序。

5- 结语

虽然这是一个非常简单的例子,但我希望它能够让人们根据自己的需要来轻松操作使用 Laravel 框架的结构标准。您可以非常轻松地更改文件的位置,以便构建基于模块化的应用程序。我的大多数项目都附带了 App / Components 模块,可以适用于任何模块可重用的泛类型的基础类; App / EloquentModules 文件夹可以用于保存 Eloquent 模型和数据库关系模型,我们可以在其中构建任何基于模块化的功能。 这是我最近开始研究的应用程序的文件夹目录结构:

我希望每个人都能从中得到这个概念,每个模块都有自己的需求,并且可以拥有自己的文件夹/实体/类/方法/属性。没有必要将所有模块标准化完全相同,因为某些模块比其他模块简单得多,并且不需要大量的结构设计。此示例显示AccountChurn模块通过 HTTP 文件夹提供 API,同时仍通过控制台提供 Artisan 命令。另一方面,AccountOverview则仅提供 HTTP API,并且依赖仓库、值对象(bags)以及服务类(paginators)来提供更大的数据价值。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29933.html

相关文章

  • 基于Laravel配置管理系统设计

    摘要:项目背景硬件架构采用,应用程式使用的进行配置管理随着业务的迭代越来越多的配置被写入文件,变得越来越臃肿,管理起来也不方便。使用守护进程,支持秒级获取配置,后续可扩展为消息订阅。架构图基于开发扩展,配置中心与客户端通信基于系统拆分为个,包包。 项目背景 硬件架构采用Nginx + SLB,应用程式使用 Laravel 的 .env 进行配置管理 ,随着业务的迭代越来越多的配置被写入 .e...

    red_bricks 评论0 收藏0
  • 从零开始做Vue前端架构(1)

    摘要:前言想想也已经做过不少架构的项目了,有基于,基于,基于,基于的。好了,介绍完毕,接下来,我就从零开始,一步一步建起前后端完全分离的前端架构了。 前言 想想也已经做过不少架构的项目了,有基于vue,基于react,基于thinkPHP,基于laravel的。 做多了,也就对现有的架构有各种想法,有好的,有坏的,总之,用起来还是不爽。vue-cli虽然可以很快地构建并使用,尤其是vue-c...

    frolc 评论0 收藏0
  • 基于LaravelAPI服务端架构代码

    摘要:服务端架构代码源码部署说明现有基于框架开发,本次介绍也针对。如接口名,对应的类文件及类名为接口命名规范命名字母按功能或模块从大到小划分,依次编写如后台用户修改密码字母最后单词为操作。 API服务端架构代码 源码 http://flc.ren/2016/08/549.htmlhttps://github.com/flc1125/Ap... 部署说明 现有API基于laravel框架开发,...

    BDEEFE 评论0 收藏0
  • PHP / Laravel API 开发推荐阅读清单

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社区优秀文章 Laravel 5.5+passport 放弃 dingo 开发 API 实战,让 API 开发更省心 - 自造车轮。 API 文档神器 Swagger 介绍及在 PHP 项目中使用 - API 文档撰写方案 推荐 Laravel API 项目必须使用的 8 个...

    shmily 评论0 收藏0
  • 造个轮子,基于 Laravel5.4 下一代 PHP 开发框架 (API/SPA/Vue2/iVi

    摘要:像操作系统一样,你可以通过安装软件,成为适用于你的电脑。先进的技术方案,使得你无需担心后期功能拓展与迭代问题,大大降低了维护成本。对于一个超过三年生命周期的项目来说,最适合不过。总之,是新的技术方向标,能让每个艺术家像构建工程一样构建程序。 这是我们团队的一个非盈利项目,以Apache2.0协议开源...不限制商用 Notadd是什么 Notadd 是基于Laravel 和 Vue 的...

    Rocture 评论0 收藏0

发表评论

0条评论

gougoujiang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<