软件架构模式 本文未发布 发布文章

未匹配的标注

介绍

能够在Apiato上构建应用的两个常用的软件架构是:

  • Porto (路由、请求、控制器、动作、任务、模型、转换器).
  • MVC ( 模型 、视图、控制器). Apiato MVC版本与标准MVC稍有不同。
    Porto是Apiato推荐的使用Apiato构建可伸缩API的架构。不过,它还支持使用流行的MVC体系结构构建API(只做了一些修改)。

Apiato特性是使用Porto编写的,可以被任何架构使用。

下面我们将看到如何同时使用任何一种体系结构来构建项目。

Porto

介绍

Porto 是由 ContainersShip 构成的软件架构。
Container 层主要是包含我们应用的业务逻辑代码。就像模块化、DDD和插件一样的架构;Apiato允许业务逻辑分离成多个文件夹名为称为 Containers。然而 Ship 层是基础代码。(在所有的 Containers 层共享的代买)。我们将很少碰到他们的。
Apiato的功能本身就是利用 Porto 软件架构模式开发的。(意味着Apiato的功能特性也在Containers层中)

大概花15分钟, 在开始之前请看 Porto 的文档,这是一个非常有用的一步。

Containers 层

关于 Containers 层请点击这里

删除 Container (默认 Containers)

Apiato有一些默认的 Containers 。 所有 containers 是可以配置的,其中一些是包含基本的功能。
假如我们不想使用Apiato的内置文档生成器这一功能。要删除这个功能,只需要删除 documentation 这个 container 即可。
要删除 Container ,只要简单的删除对应的文件夹并运行 composer update 来去除他所依赖的包。

创建新的 Container

Option 1) 自动生成:

php artisan apiato:container
跳转到[代码生成器]()页面了解更多
Refer to the code generator page for more details.

Option 2) 手动:

1、在 Containers 目录内创建新的目录。
2、创建组件并添加到目录里面。
(Ship层会为你自动加载和注册所有的组件)。
要让自动加载完美的工作,我们必须严格遵守组件和目录的命名约定和约束。因此,在创建组件时,需要引入组件的 documentation page

Container 约定

  • Container 名称必须使用大写字母开头。使用驼峰法命名 Containers。
  • 命空间应该与容器名称相同。(如果 container 命名是 Printer,那么命名空间需要是 App\Containers\Printer)。
  • Container 可以命名为任何东西。一个好的实践是将它命名为它最重要的模型名。
  • Container MAY be named to anything however. A good practice is to name it to its most important Model name. 如果用户描述是(用户可以创建一个商店,商店可以有商品),那么我们可以有3个容器(用户、商店和商品)

Ship 层

关于 Containers 层请点击这里

MVC

MVC 介绍

由于MVC的流行,以及许多开发人员没有足够的时间来学习新的架构。Apiato支持MVC架构。它与laravel MVC兼容97%。
下面我们将了解如何使用以前对Laravel MVC框架的了解,在Apiato之上构建API。

标准MVC和Apiato的MVC的区别

The Porto 架构,并没有替代MVC架构,而是对其进行了更好的扩展, 所以模型,视图,路由和控制器仍然存在,但在不同的地方对组件的类的类型有了严格的功能要求。

安装我的Apiato MVC应用程序

1) 得到新版本的 Apiato

2) 创建应用程序

如果我们打开 app/Containers/ 目录,我们将看到一些 Proto’s 的Containers,每个 container 都会为你提供一些特性。但是,我们不需要修改它们,不管我们是使用Porto还是MVC架构。现在先忘掉所有这些文件夹。

我们只需要创建一个名为 Application 的新文件夹(您的MVC应用程序,它是Laravel项目根目录下的 app 文件夹的替代方案)。此文件夹将保存所有模型、视图、路由、控制器等文件。

3) 创建路由文件

在Laravel 5.6中,route文件位于项目根目录的“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 创建 api.php 替代 Laravel’s routes/api.php,在 app/Containers/Application/UI/API/Routes/web.php 创建 web.php 替代 routes/web.php

在这两个文件中创建所有路由,就像在Laravel中一样。

注意: 在路由文件中,必须使用 $router-> 而不是facade Route::

例如:

<?php

// 使用 `$router `变量
$router->get('/', function () {
    return view('welcome');
});

// 不要使用 facade 的 `Route` 
Route::get('/', function () {
    return view('welcome');
});

4) 创建 Controller

在Laravel 5.6中,控制器类位于 app/Http/Controllers/ 文件夹中。但是在Apiato MVC中,Controller类应该存在:

  • /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 中,Models的类文件在 app/Containers/Application/Models. 目录中
所有的 Model 文件必须继承 App\Ship\Parents\Models\Model 这个类

注意 User 模型应该保持在用户容器中(app/Containers/User/Models/User.php),以便在不做任何修改的情况下保持所有特性正常工作。

6) 创建视图

在 Laravel 5.6 中,视图文件存放于 resources/views/ 目录中。在 Apiato 的 MVC 中,视图文件可以存放在相同的目录或则在 容器的文件下 app/Containers/Application/UI/WEB/Views/

7) 创建 Transformers

在 Laravel 5.6 中,Transformers 类一般存放在 app/Transformers/ 目录中, 但是在 Apiato MVC中 Transformers 存放在 app/Containers/Application/UI/API/Transformers/ 中 。Transformers 必须继承 App\Ship\Parents\Transformers\Transformer

8) Create Service Providers

在 Laravel 5.6 中, 服务提供者存放在 app/Providers/ 目录中,但是在 Apiato MVC 中,Service Providers 的类存放在 app/Containers/Application/Providers/ 中,当然也可以放在任何你想要放的位置。
如果希望自动加载服务提供者(不需要在 config/app.php文件中配置),你需要将你的文件命名为 MainServiceProvider.php(全路径 app/Containers/Application/Providers/MainServiceProvider.php)。否则,您可以在任何地方创建服务提供者,并在Laravel中手动注册它们。

9) 创建 Migrations


在 Laravel 5.6 中 ,Migrations 类位于 database/migrations/ 目录中,在 Apiato MVC 中,Migrations 可以在同样的目录下或者在 container 的 app/Containers/Application/Data/Migrations/ 目录下。

10) 创建 Seeds

在 Laravel 5.6 中 ,Seeds 类位于 database/seeds/ 目录中,在 Apiato MVC 中,Seeds 可以在同样的目录下或者在 container 的 app/Containers/Application/Data/Seeders/ 目录下。

其他类

所有其他类类型的工作方式都是相同的,您可以参考文档,了解在哪里放置它们以及它们应该扩展什么。如需了解更多细节,请随时与我们联系Slack

怎么使用Apiato的特性

Apiato的特性都是由 Actions 和 Tasks 类提供的

  • 每个Action类都有一个函数 run,它只执行一个功能。

  • 每个任务类都有一个函数 run,它只执行一个任务(业务逻辑的一小部分)。
    你能够使用 Actions/Tasks 类在你想要的位置

  • 使用具有Apiato调用者风格的Apiato Facade $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);
    要有创意,在一天结束的时候,这是一个有功能的类。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~