viewflex/ligero

一个 Laravel BREAD 微框架,支持通过 UI 和 API 控制器快速建模领域,具有多种视图模式、高级搜索、分页、演示者、本地化和缓存。

1.1.4 2019-11-13 02:54 UTC

This package is auto-updated.

Last update: 2024-09-13 13:42:55 UTC


README

GitHub license

快速入门

一个 Laravel BREAD 微框架,支持通过 UI 和 API 控制器快速建模领域,具有多种视图模式、高级搜索、分页、演示者、本地化和缓存。

快速入门 | 配置 | 高级使用

安装

从您的 Laravel 应用程序根目录开始,使用 Composer 安装

$ composer require viewflex/ligero

LigeroServiceProvider 添加到 Laravel 的 config/app.php 文件中的提供者列表。

Viewflex\Ligero\LigeroServiceProvider::class,

概述

目标是提供一个灵活、可扩展的 BREAD (浏览-读取-编辑-添加-删除) 微框架,它易于理解和使用,同时整合所有必要的类类型,遵循 SOLID 设计原则,并实现领域的快速建模。

BREAD 操作和动态控件生成是通过一个 发布者 对象完成的,该对象为业务或应用程序领域提供了一个特定的表示。发布者封装了一组独特的组件,代表配置、请求和存储库 - 通过配置这些组件,我们可以为所需的任务定制发布者。

此包结合了一个优雅的界面来创建、配置和使用发布者,具有模块化架构,允许通过扩展或装饰增强所有组件。它提供了发布者控制器和上下文的脚手架,为实施简单的 BREAD 功能和复杂的跨领域应用程序和服务提供了路径。

此文档以及包含的演示,展示了在现实世界应用程序中实现发布者的各种方法,但最简单形式是这一行创建了一个配置好的发布者,它返回包含所需结果和 UI 数据的数据包。

$data = (new Publisher($config, $request))->getData();

管理复杂性

让我们面对现实,即使是简单的 BREAD 实现,也不仅仅是调用几个 Eloquent 方法。但是,实际上,即使是复杂的多领域应用程序,大部分代码都可以拆分为可重用的标准组件。此包试图尽可能抽象出功能,以支持轻松声明性配置领域发布者或上下文,从而快速原型化领域和服务层。

架构

各种类类型的组装遵循 策略模式,并为处理 BREAD 请求、返回原始或展示结果以及为 UI 控件生成动态上下文数据提供所有必要的功能。

publisher flow

此模式可以轻松复制以适用于每个领域,从而快速搭建具有许多领域的应用程序。包含的演示展示了使用示例 项目 领域部署 UI 和 API 控制器。该演示还包括一个上下文示例(在 DDD 术语中的含义),它封装了一个发布者和其组件。

了解任何代码库的一个好方法是从 接口 开始。在此包中,几乎每个类都实现了接口,提供核心功能的清晰映射,并解耦代码,允许扩展、装饰或替换任何类,而不会产生副作用。

在开始使用此包之前,没有必要了解每个组件 - 所有配置都可以流畅地进行,无需扩展或装饰类。参见以下部分,以快速使用您自己的自定义 BREAD 领域启动。

入门

本软件包提供了多种方式来创建和部署领域发布者,具体取决于特定领域的需求复杂度。请参阅以下基本用法(下方)和高级用法文档以获取示例。

基本使用

由于此软件包旨在具有最大可扩展性,因此它可以以多种不同的方式使用。通常,您将实现一个发布者,在UI控制器或API控制器中,至少作为路由端点的基本BREAD方法。以下示例展示了创建一个用于领域发布者的状态性UI控制器。请参阅高级用法文档了解如何使用内置API控制器。

《项目》演示

实现发布者的方式有多种,让我们先从演示UI控制器开始。

demo screenshot

上图中的《项目》UI是本软件包中提供的演示的一部分;您可以使用以下列出的演示UI路由尝试它。它实现了具有三种视图模式和创建/编辑操作的输入表单的BREAD UI。模板全部是纯HTML,并使用Bootstrap.css,但显示的生成数据也可以使用任何前端框架来呈现。

本软件包将表示与应用程序逻辑分离,生成所有必要的动态UI组件数据元素的结果,以标准化的格式预包装(使用“项目 > 显示为JSON”菜单命令查看原始数据)。

使用演示作为模板

请参阅下方的发布软件包文件部分,了解如何通过发布(复制)演示并对其进行定制来快速构建新领域。

演示UI控制器

我们从扩展BasePublisherController的新控制器开始,以继承感知会话的BREAD操作和生成的UI控件。在构造函数中,我们创建一个默认的发布者,然后根据需要使用流畅的设置方法覆盖默认值(请参阅配置文档以获取完整列表)。

namespace Viewflex\Ligero\Publish\Demo\Items;

use Viewflex\Ligero\Base\BasePublisherController;

class ItemsController extends BasePublisherController
{
    public function __construct()
    {

        $this->createPublisherWithDefaults();

        $this
            ->setDomain('Items')
            ->setTranslationFile('items')
            ->setTableName('ligero_items')
            ->setModelName('Viewflex\Ligero\Publish\Demo\Items\Item')
            ->setResultsColumns([
                'id',
                'active',
                'name',
                'category',
                'subcategory',
                'description',
                'price'
            ])
            ->setWildcardColumns([
                'category'
            ])
            ->setControls([
                'pagination'        => true,
                'keyword_search'    => true
            ])
            ->setKeywordSearchColumns([
                'name',
                'category',
                'subcategory',
                'description'
            ])
            ->setQueryRules([
                'active'            => 'boolean',
                'name'              => 'max:60',
                'category'          => 'max:25',
                'subcategory'       => 'max:25'
            ])
            ->setRequestRules([
                'active'            => 'boolean',
                'name'              => 'max:60',
                'category'          => 'max:25',
                'subcategory'       => 'max:25',
                'description'       => 'max:250',
                'price'             => 'numeric'
            ]);

    }

}
演示UI路由

在Laravel中,可以通过一行代码指定资源控制器路由,但通过使用显式路由,如以下所示,我们可以确保路由参数名称始终为{id},因为代码库期望如此。否则,Laravel将自动使用模型名称的单数形式。

应首先声明额外的路由。这两个路由为《项目》领域的BREAD层添加了一些特殊功能

Route::get('ligero/items/json', array('as' => 'ligero.items.json', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@json', 'middleware' => 'web'));
Route::get('ligero/items/action', array('as' => 'ligero.items.action', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@action', 'middleware' => 'web'));

这是《项目》演示领域的标准资源控制器路由

Route::get('ligero/items', array('as' => 'ligero.items.index', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@index', 'middleware' => 'web'));
Route::get('ligero/items/create', array('as' => 'ligero.items.create', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@create', 'middleware' => 'web'));
Route::get('ligero/items/{id}', array('as' => 'ligero.items.show', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@show', 'middleware' => 'web'));
Route::get('ligero/items/{id}/edit', array('as' => 'ligero.items.edit', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@edit', 'middleware' => 'web'));
Route::post('ligero/items/store', array('as' => 'ligero.items.store', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@store', 'middleware' => 'web'));
Route::put('ligero/items/{id}', array('as' => 'ligero.items.update', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@update', 'middleware' => 'web'));
Route::delete('ligero/items/{id}', array('as' => 'ligero.items.destroy', 'uses' => '\Viewflex\Ligero\Publish\Demo\Items\ItemsController@destroy', 'middleware' => 'web'));
演示API路由

除了在演示中使用的UI控制器之外,本软件包还包括一个上下文和API控制器,为同一《项目》领域的API路由提供服务。请参阅高级用法文档了解API调用如何路由。

超越BREAD思考

现在您看到实现发布者有多么容易,您可能会想知道它们如何在正在开发的应用程序更广泛的环境中应用。如果您在设计应用程序时考虑了领域驱动设计(DDD),请参阅高级用法文档了解内置对边界上下文的支撑。

自定义

本包包含一个示例域名,提供使用UI控制器和API控制器发布域的示例。要将示例 Items 域的编辑版复制并使用作为新域的模板,只需运行带有 ligero 标签的 publish 命令,执行迁移,并按照以下说明在示例数据库表中填充数据。

复制并重命名所需的示例文件,并更改类名。复制并重命名资源文件(视图和语言),并根据需要自定义。根据需要创建并填充新的数据库表。

发布包文件

包服务提供程序配置了 artisan 以标签的形式发布特定的文件组。有多种选项可供选择。

路由

运行此命令以将 routes.php 文件发布到项目的 publish/viewflex/ligero 目录

php artisan vendor:publish  --tag='ligero-routes'
配置

运行此命令以将 ligero.php 配置文件发布到项目的 config 目录进行自定义

php artisan vendor:publish  --tag='ligero-config'
资源

运行此命令以发布示例UI的blade模板以及包消息和UI字符串的语言文件

php artisan vendor:publish  --tag='ligero-resources'
路由、示例迁移和填充器

运行此命令以安装 'Items' 示例域的迁移和填充器

php artisan vendor:publish  --tag='ligero-data'

发布示例迁移和填充器后,运行迁移

php artisan migrate

然后运行填充器

php artisan db:seed --class="LigeroSeeder"
路由、配置、资源、示例迁移和填充器

使用此命令发布配置、示例视图和语言文件进行修改。示例迁移和填充器也将复制到相应的目录

php artisan vendor:publish  --tag='ligero'

扩展或装饰基类

Ligero 的架构基于一种独特的类类型模式,每个类型由一个接口定义;由于类作为抽象类型相互关联,因此您可以很容易地用您自己的自定义类替换,前提是它们实现了相同的接口。

自定义类的命名空间

publish/viewflex/ligero 目录对应的 Viewflex\Ligero\Publish 命名空间被包识别,并用于组织您的自定义类。示例 Items 类将发布(复制)到该目录进行自定义,以及示例路由文件。

测试

可以按照 测试文档 中的说明运行 phpunit 测试。

许可证

本软件根据 MIT 许可证 提供。

变更日志

版本发布记录在 变更日志 中。

贡献

请参阅 贡献指南 了解更多关于项目目标以及您如何帮助的信息。