Apiato 应用程序-入门-软件架构模式
介绍
用于在Apiato之上构建项目的两种最常见的体系结构是:
- Porto:(Route Request Controller Action Task Model Transformer)。
-
MVC (Model View Controller) Apiato MVC版本与标准MVC略有不同。
Porto是Apiato推荐的架构,用于使用Apiato构建可扩展的API。但是,它也支持使用流行的MVC架构构建API(稍作修改)。
Apiato功能是使用Porto编写的,可以被任何架构使用。
您将在下面看到如何构建项目的任何架构。
Porto
介绍
Porto是一个由Containers和Ship2层组成的体系结构。
该Containers层包含你的应用程序的业务逻辑代码。与Modular,DDD和插件架构相同; Apiato允许将业务逻辑分成多个名为Containers的文件夹。虽然Ship层包含的基础代码(所有你之间共享代码容器)。然而你很少会碰它。
Apiato功能本身是使用Porto Software Architectural Pattern开发的。(表示Apiato中提供的功能存在于容器中)
花费15分钟,在开始之前阅读Porto文档,是一个很好的时间投入。
容器层
在这里阅读Containers图层
删除容器(默认容器)
Apiato附带一些默认容器。所有容器都是可选的,其中一些容器包含必要的功能。
假设您不想使用Apiato的内置文档生成器功能。要删除该功能,您只需删除documentation
容器即可。
要删除Container,只需删除该文件夹,然后运行composer update
以删除其依赖项。
创建新的Container
选项1)使用代码生成器:php artisan apiato:container
有关更多详细信息,请参阅代码生成器页面。
选项2)手动:
- 在Containers文件夹中创建一个文件夹。
- 开始创建组件并将其添加到其中。
(船舶引擎将自动加载并自动为您注册所有内容)。
为了使自动加载能够完美运行,您必须遵守组件的命名约定和目录。因此,您需要documentation page
在创建组件时参考该组件。集装箱约定
- 容器名称应该从Capital开始。使用CamelCase重命名容器。
- 名称空间应与容器名称相同,(如果容器名称为“打印机”,则名称空间应为 App\Containers\Printer)。
- 容器可以命名为任何东西。一个好的做法是将其命名为最重要的模型名称。 示例:如果用户故事是(用户可以创建商店,商店可以有商品),那么我们可以拥有3个容器(用户,商店和商品)。
船舶层
在这里阅读Ship层
MVC
MVC简介
由于MVC的普及,以及许多开发人员没有足够的时间来了解新架构的事实。Apiato,支持MVC架构。这与laravel MVC有97%的兼容性。
下面您将学习如何使用您之前对Laravel MVC框架的了解,在Apiato之上构建API。
标准MVC和Apiato的MVC之间的区别
Porto架构并没有取代MVC架构,而是将其扩展为好。因此,模型,视图,路由和控制器仍然存在,但在不同的地方,每个组件都有严格的职责 class type
。
设置我的Apiato MVC应用程序
1)首先获得Apiato的新版本
2)创建应用程序
如果你打开,app/Containers/
你会看到Proto的容器列表,每个容器都为你提供一些功能。但是,无论您使用的是Porto还是MVC架构,都无需修改它们。所以暂时忘记所有这些文件夹。
我们所需要的只是创建一个名为的新文件夹Application
(您的MVC应用程序,它app
是Laravel项目根目录下的文件夹的替代品)。此文件夹将保存您的所有模型,视图,路由,控制器等文件。
3)创建路由文件
在Laravel 5.6中,路径文件位于routes/
项目根目录下的文件夹中。但是在Apiato MVC中,路径文件应该存在:
app/Containers/Application/UI/API/Routes/
(对于API路由)app/Containers/Application/UI/WEB/Routes/
(用于WEB路由)
建立api.php
在app/Containers/Application/UI/API/Routes/api.php
“替代Laravel的routes/api.php
”创建web.php
在app/Containers/Application/UI/API/Routes/web.php
“替代Laravel的routes/web.php
”
在这两个文件中,像在Laravel中一样创建所有端点。注意:您必须在路径文件中使用
$router->
而不是外观Route::
。
例:
<?php
// Use this `$router` variable
$router->get('/', function () {
return view('welcome');
});
// DO not use the `Route` facade
Route::get('/', function () {
return view('welcome');
});
4)创建控制器
在Laravel 5.6中,Controllers类位于该app/Http/Controllers/
文件夹中。但在Apiato MVC中,Controller
课程应该存在:
app/Containers/Application/UI/API/Controllers/Controller.php
(处理API路由)必须延伸App\Ship\Parents\Controllers\ApiController
app/Containers/Application/UI/WEB/Controllers/Controller.php
(处理WEB路由)必须延伸App\Ship\Parents\Controllers\WebController
5)创建模型
在Laravel 5.6中,Models类位于app/
文件夹的根目录中。但是在Apiato MVC中,模型类应该存在app/Containers/Application/Models
。
所有型号必须extend
来自App\Ship\Parents\Models\Model
。
请注意,
User
Model应保留在User Container(app/Containers/User/Models/User.php
)中,以保持所有功能无需任何修改即可运行。
6)创建视图
在Laravel 5.6中,视图文件存在于该resources/views/
文件夹中。在Apiato MVC中,Views文件可以存在于同一目录或/和此容器文件夹中app/Containers/Application/UI/WEB/Views/
。
7)创建变形金刚
在Laravel 5.6中,变形金刚类存在于app/Transformers/
文件夹中。但是在Apiato MVC中,控制器类应该存在app/Containers/Application/UI/API/Transformers/
。
变形金刚必须延伸App\Ship\Parents\Transformers\Transformer
。
8)创建服务提供商
在Laravel 5.6中,服务提供程序类位于该app/Providers/
文件夹中。但是在Apiato MVC中,Controllers类可以存在app/Containers/Application/Providers/
,但也可以存在于其他任何地方。
如果您希望自动加载服务提供程序(无需在config/app.php
文件中注册),请将文件重命名为 MainServiceProvider.php
(完整路径app/Containers/Application/Providers/MainServiceProvider.php
)。否则,您可以在任何地方创建服务提供商,并在Laravel中手动注册它们。
9)创建迁移
在Laravel 5.6中,迁移类位于database/migrations/
项目根目录下的文件夹中。在Apiato MVC中,迁移类可以位于同一目录或/和此容器文件夹中 app/Containers/Application/Data/Migrations/
。
10)创建种子
在Laravel 5.6中,种子文件位于database/migrations/
项目根目录下的文件夹中。在Apiato MVC中,种子文件可以存在于同一目录或/和此容器文件夹中app/Containers/Application/Data/Seeders/
。
更多课程
所有其他类类型的工作方式相同,您可以参考文档中的位置以及它们应该扩展的内容。有关详细信息,您可以随时与我们联系Slack。
如何使用Apiato功能
Apiato功能都作为Actions和Tasks类提供。
- 每个Action类都有单个函数
run
,只执行一个功能。 - 每个Task类都有单个函数
run
,它只能完成一个作业(业务逻辑的一小部分)。
您可以随意使用Actions / Tasks类: - 使用Apiato门面和Apiato来电风格
$user = \Apiato::call('Car@GetDriversAction', [$request->id]);
- 使用带有全类名称的Apiato Facade
$user = \Apiato::call(GetDriversAction::class, [$request->id]);
- 使用具有完整类名的辅助调用函数
$user = $this->call(GetDriversAction::class, [$request->id]);
- 使用具有Apiato调用方式的帮助程序调用功能
$user = $this->call('Car@GetDriversAction', [$request->id]);
- 没有Apiato参与使用普通的PHP
$user = $action = new GetDriversAction::class; $action->run($request->id);
- 没有Apiato参与使用普通的Laravel IoC
$user = \App::make(GetDriversAction::class)->run($request->id);
要有创意,最后这是一个有功能的课程。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: