通过 Apiato 框架引入构建 API 应用的两种软件架构模式 —— Porto / MVC | Laravel 学院


本站和网页 https://xueyuanjun.com/post/9217.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

通过 Apiato 框架引入构建 API 应用的两种软件架构模式 —— Porto / MVC | Laravel 学院
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
图书
博客
通过 Apiato 框架引入构建 API 应用的两种软件架构模式 —— Porto / MVC
通过 Apiato 框架引入构建 API 应用的两种软件架构模式 —— Porto / MVC
由 学院君 创建于4年前, 最后更新于 2年前
版本号 #2
14773 views
9 likes
0 collects
接下来的系列中,我们将基于 Apiato 这个 API 框架来演示如何快速构建 API 应用来实现常见功能。
前面我们在 Apiato 快速入门 这篇文档中大概已经了解了 Apiato 的功能特性以及如何创建一个新的应用并对应用接口的访问有了初步的了解,在继续深入介绍该框架所有功能特性之前我们先来了解下 Apiato 框架的架构模式,以便从根本上了解框架的运行原理,从而更好地掌握它。
锲子
我们可以通过以下两种常见的软件架构模式基于 Apiato 来构建应用:
Porto(Porto 是什么,请参考下面的介绍)
MVC(Apiato 中的 MVC 和标准的 MVC 模式有些区别,后面我们会深入探讨)
MVC 想必很多人耳熟能详,指的是软件架构模式中的模型(Model)-视图(View)-控制器(Controller)模式,很多基于 PHP 框架的应用默认都是这个架构模式,Laravel 也不例外。
不过,在 Apiato 中我们推荐使用 Porto 模式来构建可扩展的 API(虽然也支持 MVC 模式),Apiato 默认基于 Porto 模式构建,下面我们就来演示如何在 Apiato 分别使用这两种架构模式。
Porto
简介
Porto 是一个现代的软件架构模式(SAP),被设计用于帮助开发者以高可维护性、可复用的方式来管理组织代码。对于中大型项目而言,随着代码越来越复杂,相对 MVC 而言,Porto 是个绝佳的替代方案。
Porto 脱胎自 MVC(Model-View-Controller)、DDD(Domain-driven design)、ADR(Action–domain–responder)、模块化以及分层等架构模式,同时遵循一系列的软件设计原则,如 SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)、OOP(面向对象程序设计)、LIFT(这是啥)、DRY(不要重复造轮子)、CoC(约定优于配置)、GRASP(通用责任分配软件模式)、Generalization(泛化)、高内聚、低耦合等。
功能特性
解耦:将业务逻辑与底层基础设施以及框架核心分离:底层代码包含框架核心(一般位于vendor目录下);中间层代码包含应用通用底层代码(一般位于App/Ship目录下);上层代码包含业务逻辑代码(一般位于App/Container目录下)
模块化:Porto 业务逻辑代码一般会以功能维度划分到多个容器中,这些容器位于 Containers 目录下。容器和模块化中的模块类似,不同之处在于容器件组件可以相互调用。
易测试:每个容器都包含一个 Tests 目录用于单元测试。
易定位:Porto 架构的一大好处是可以快速在大量代码中找到指定代码片段。
可扩展
Apiato 中的 Porto 架构
Apiato 默认就是采用这种架构模式来实现:
包含 Container 层(处理业务逻辑)和 Ship 层(基础代码实现)。
其中,Container 层负责处理业务逻辑,类似模块、DDD(Domain-Driven Design)和插件;Apiato 允许将业务逻辑分割到多个不同的称之为 Container 的文件夹。
而 Ship 层负责应用的基础设施代码,承担着连接更底层框架核心和业务代码的桥梁功能,同时也为上层业务逻辑提供公共的服务方法。
下图可能更加形象:
Apiato 请求生命周期
典型的 API 调用场景如下:
用于请求匹配到指定入口路由
入口路由调用中间件处理认证
调用与路由匹配的控制器动作
注入到控制器的请求实例自动应用验证和授权规则
控制器调用Action并传入请求数据
Action处理业务逻辑,或者调用相应的任务处理可复用的业务逻辑子集
任务类处理业务逻辑子集(一个任务只做一件事)
Action聚合处理结果并返回给控制器
控制器构建响应并将其通过视图或转化器(Transformer)发送给用户
注:关于 Porto 模式的更多细节可以参考其 Github 项目。
容器(Container)开发
移除容器
Apiato 默认自带了一些容器,所有这些容器都是可选的,如果我们不想要其中某个容器,比如 Document 容器,可以直接将容器对应文件夹删除,然后运行 composer update 移除依赖。
创建新容器
我们可以通过 Artisan 命令 php artisan apiato:generate:container 快速创建新容器。
容器约定
容器名称遵循驼峰格式
命名空间需要和容器名称保持一致
理论上可以任意命名容器名称,不过推荐使用主模型的名字作为容器名
MVC
由于 MVC 的流行,以至很多开发者没有意愿花费精力去学习新的架构模式,所以 Apiato 也支持 MVC 架构,但是和标准的 MVC 略微有点差别。
下面我们来看看如何基于 MVC 在 Apiato 之上构建 API 应用。
设置 Apiato MVC 应用
安装新的 Apiato 应用
具体细节可参考 Apiato 快速上手文档。
创建应用
忽略 Apiato 自带的 app/Containers 中提供的所有容器,在 app/Containers 目录下单独新建一个 Application 目录用于存放模型、视图、控制器等。
创建路由文件
在 Laravel 中,路由文件默认存放在 routes 目录下。但是在 Apiato MVC 中,路由文件需要存放在以下路径下:
app/Containers/Application/UI/API/Routes/(API路由)
app/Containers/Application/UI/WEB/Routes/(Web路由)
在 app/Containers/Application/UI/API/Routes/ 下创建 api.php 文件,在 app/Containers/Application/UI/WEB/Routes/ 目录下创建 web.php 文件。
另外需要注意的是在路由文件中必须使用 $router-> 来替代 Route:: 门面:
<?php
// 使用 `$router` 变量
$router->get('/', function () {
return view('welcome');
});
// 不要使用 `Route` 门面
Route::get('/', function () {
return view('welcome');
});
创建控制器
在 Laravel 中,控制器位于 app/Http/Controllers 目录下,和路由类似,在 Apiato MVC 中,控制器需要存放在以下目录中:
app/Containers/Application/UI/API/Controllers/(处理API请求,必须继承自App\Ship\Parents\Controllers\ApiController)
app/Containers/Application/UI/WEB/Controllers/(处理Web请求,必须继承自App\Ship\Parents\Controllers\ WebController)
创建模型
在 Laravel 中,模型类位于 app 目录下,在 Apiato MVC 中,模型位于 app/Containers/Application/Models/ 目录下,且必须继承自 App\Ship\Parents\Models\Model。
创建视图
在 Laravel 中,视图位于 resources/views/ 目录下,在 Apiato MVC 中,视图类需要存放在 app/Containers/Application/UI/WEB/Views/ 目录。
创建转化器
在 Laravel 中,转化器位于 app/Transformers/ 目录,在 Apiato MVC 中,存放在 app/Containers/Application/UI/API/Transformers/,用于处理数据格式转化,转化器必须继承自 App\Ship\Parents\Transformers\Transformer。
创建服务提供者
在 Laravel 中,服务提供者位于 app/Providers/ 目录,在 Apiato MVC 中,一般存放在 app/Containers/Application/Providers/ 目录下,如果你想要服务提供者可以被自动加载,而无需在 config/app.php 中手动注册,需要将 MainServiceProvider.php (app/Containers/Application/Providers/MainServiceProvider.php)重命名,否则需要手动注册。
创建数据库迁移文件
在 Laravel 中,迁移文件位于 database/migrations/,在 Apiato MVC 中,对应目录是 app/Containers/Application/Data/Migrations。
创建数据填充器
在 Laravel 中,填充器类位于 database/migrations/,在 Apiato MVC 中,需要存放在 app/Containers/Application/Data/Seeders/ 目录。
如何使用 Apiato 功能
Apiato 的所有功能都以 Action & Task 类的方式提供:
每个 Action 类都有且只有一个 run 方法实现某个独立功能;
每个 Task 类都有且只有一个 run 方法实现某个独立任务
你可以在任意地方调用 Action/Task 类:
$user = \Apiato::call('Car@GetDriversAction', [$request->id]);
$user = \Apiato::call(GetDriversAction::class, [$request->id]);
$user = $this->call(GetDriversAction::class, [$request->id]);
$user = $this->call('Car@GetDriversAction', [$request->id]);
$user = $action = new GetDriversAction::class; $action->run($request->id);
$user = \App::make(GetDriversAction::class)->run($request->id);
Laravel
生命周期
架构模式
API
MVC
Apiato
Porto
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
2018 年 Web 开发工程师学习进阶路线图
>> 下一篇:
图解正向代理、反向代理、透明代理:可能是你见过的讲解最透彻的代理技术教程
无评论
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
锲子
Porto
简介
功能特性
Apiato 中的 Porto 架构
Apiato 请求生命周期
容器(Container)开发
MVC
设置 Apiato MVC 应用
如何使用 Apiato 功能
最新发布
支付 API 开发
测试驱动 Laravel API 开发
编码实战篇
员工 API 开发(下)
测试驱动 Laravel API 开发
编码实战篇
员工 API 开发(上)
测试驱动 Laravel API 开发
编码实战篇
部门 API 开发
测试驱动 Laravel API 开发
编码实战篇
项目初始化
测试驱动 Laravel API 开发
编码实战篇
相关推荐
Laravel 5 岁了,Happy Birthday!
博客
基于 Laravel 的 API 服务端架构代码
博客
关于 Laravel 新版本的发布时间调整
博客
Laravel 代码开发最佳实践
博客
laravel添加api缓存系统
博客
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助