alphazento/zento

Alphazento 框架支持

1.0 2020-04-27 04:20 UTC

This package is auto-updated.

Last update: 2024-09-20 23:49:07 UTC


README

这是一个用于为 Laravel 项目提供模块化解决方案的包。

它包含三个子包: Kernel, ThemeManager, UrlRewriter。这三个包中只有 "Kernel" 是强制启用的,UrlRewriter 和 ThemeManager 可以根据项目需求启用或禁用。

Kernel 包

Kernel 包通过配置一些关键概念(如 Provider, Middleware, Middleware Group, 命令行, 路由, 主题包, 监听器)扩展了 Laravel 项目的包管理功能。

它提供了一个名为 mypackages 的文件夹作为私有包代码库,您可以在该文件夹中使用 artisan make:package 创建私有包。

此包还提供了一些有用的功能

  1. 配置系统,可以连接到数据库(或您也可以定义自己的配置扩展)
  2. 动态属性、事件和序列监听器。

通过运行命令启用此包

php artisan package:enable Zento/Kernel

ThemeManager

通过运行命令启用此包

php artisan package:enable Zento/ThemeManager

UrlRewriter

UrlRewriter 为 Laravel 提供了 URL 重新编写管理。您可以将静态 URL 连接到您的 Laravel 路由。

启用此包后,它将创建一个名为 'url_rewrite_rules' 的新表,您可以在其中管理您的 URL 重新编写。

通过运行命令启用此包

php artisan package:enable Zento/UrlRewriter

安装

请通过 composer 安装它

composer require alphazento/zento:dev-master

I. 包开发

Alphazento/Zento 扩展了 Laravel 包发现,并在项目根路径中提供了一个新的 "mypackage" 文件夹。此文件夹也将由 "package:discover" 发现,您可以将您的私有代码库放在这里。

包发现

此包通过将 "zento" 部分添加到您的包的 composer.json 文件中的 "extra" -> "laravel" 部分来扩展 Laravel 的 包发现 功能。

"extra": {
    "branch-alias": {
        "dev-master": "1.0-dev"
        },
        "laravel": {
            "providers": [
                "Zento\\Kernel\\Providers\\KernelProvider"
            ],
            "aliases": {
                "PackageManager": "Zento\\Kernel\\Facades\\PackageManager",
                "EventsManager": "Zento\\Kernel\\Facades\\EventsManager",
                "Debugger": "Zento\\Kernel\\Facades\\Debugger"
            },
            "zento": {
                "Vendor_SamplePackage":{
                "providers": [
                ],
                "version" : "0.0.1",
                "commands" : [
                ],
                "middlewares" : {},
                "middlewaregroup": {
                    "GROUPNAME" : {
                        "main" : [
                        ],
                        "pre" : [
                        ],
                        "post" : [
                        ],
                    },
                },
                "listeners" : {
                    "EVENT-CLASS-NAME" : {
                        "10":"OBSERVER-CLASS-NAME"
                        }
                },
            }
        }
    }
},

MyPackage 文件夹结构

您可以通过以下命令创建您的包

artisan make:package VendorName_PackageName

然后它将在路径: projectroot/mypackages/VendorName/PackageName 中预创建一个文件夹

/mypackages/{VendorName/{PackageName# tree
.
|-- Console
| `-- Commands //put your console command class files here
|
|-- Http
| |-- Controllers //put your Controllers class files here
| `-- Middleware //put your middleware class files here
|
|-- Model //put your Model class files here
|
|-- Providers //put your ServiceProvider class files here
| `-- Facades
|
|-- Services //put your real service class files here
|
|-- Events //Put event class and listener class here
| |-- Listeners
|
|-- database //database migration management here
| |-- 0.0.1 //version number
| |-- 01_create_sample_table1.php
| |-- 0.0.2 //version number
| |-- 01_create_sample_table2.php
|
|-- resources //everything about frontend,please put here
| |-- public
| | |-- css
| | |-- font
| | |-- images
| | `-- js
| `-- views //your views. Please use it by: view('VendorName.'), with your VendorName_PackageName prefix.
|
|-- composer.json //Config extra/laravel/zento setting here
|
`-- routes.php.example //Please change it as "routes.php" if you want to use routes.

II. 使用

1 命令行

此包扩展了一些命令行

1) make:package

2) package:enable

artisan package:enable VendorName_PackageName

它将注册包到系统中,因此它的提供者、中间件、中间件组、命令行和事件监听器将被注册,然后您可以使用这些资源。

如果 Zento 包未注册,上述资源将无法使用。但当然,您仍然可以使用它的类。

2) package:disable

禁用包。(但它的类仍然可以使用。

artisan package:disable VendorName_PackageName

3) package:discover

此命令行来自原始 Laravel,但我们将其扩展为发现您在 mypackages 中创建的包。它还将合并并缓存您的包的 composer.json 文件中的配置项。

artisan package:discover

4) listeners

Zento Kernel 扩展了原始 Laravel Event/Listener。原始 Laravel Event 的 Listener 不支持控制监听器调用的序列,但很多时候您的监听器必须按照特定的序列调用。通过运行以下命令

artisan listeners

它将列出您的包正在监听的事件以及这些监听器调用的序列。

2. 扩展功能

1). 动态属性

Zento Kernel 包将动态属性功能引入 Eloqument。您可以通过不更改模型数据库表来轻松扩展现有 eloqument 的属性。

动态属性有两种类型

属性只有一个值

选项

属性有多个选项值。

为模型创建一个动态属性

动态属性工厂::createRelationShipORM($模型类名, $动态属性名, $选项数组, $是否为单条或选项)

通过调用此函数,将为模型生成动态属性表。动态属性工厂::createRelationShipORM(\命名空间\类::class, '属性', ['char', 32], true);

使用withDynamicSingleAttribute和withDynamicOptionAttribute扩展来检索动态属性

您可以使用withDynamicSingleAttribute(single)或withDynamicOptionAttribute(option) $collection = \Zento\Kernel\TestModel::where('id', 1)->withDynamicSingleAttribute('new_column')->first();

listDynamicAttributes

此函数将列出现有模型的全部动态属性

如何使用它

如果您想使Eloquemnt模型具有动态属性的功能,您可以使用Zento\Kernel\Booster\Database\Eloquent\DynamicAttribute\DynamicAttributeAbility特性来实现。此特性在hasOneDyn,hasManyDyns函数中默认导入,并与Zento\Kernel\Booster\Database\Eloquent\DynamicAttribute\Builder一起工作,以提供withDynamicSingleAttribute和withDynamicOptionAttribute

class TestModel extends \Illuminate\Database\Eloquent\Model {
use \Zento\Kernel\Booster\Database\Eloquent\DynamicAttribute\DynamicAttributeAbility;
}

DanamicAttributeFactory::createRelationShipORM(TestModel::class,
'new_column', ['char', 32], true);
DanamicAttributeFactory::createRelationShipORM(TestModel::class,
'new_column1', ['char', 32], false);

TestModel::listDynamicAttributes(); //list all dynamic Attributes

$collection = TestModel::where('id', 1)->withDynamicSingleAttribute('new_column')->withDynamicOptionAttribute('new_column1')->first();

2). 配置扩展

Zento\Kernel包扩展了原始Laravel配置功能。原始配置仅从配置文件夹加载配置。通过此扩展,我们在数据库中创建了一个“config_items”表,并将“Zento\Kernel\Booster\Config\ConfigInDB\ConfigRepository”作为默认的数据库配置仓库。

当尝试获取配置值时,它将尝试使用默认配置(从配置文件夹获取),如果没有配置项,则尝试从表中获取。

它还提供了一个接口供您自定义配置仓库。这意味着您可以定义自己的配置逻辑,而不是使用存储在数据库中的默认逻辑。

您可以在config/zento.php中定义自己的配置仓库

'config_extend' => [
'extra_repository' => \Zento\Kernel\Booster\Config\ConfigInDB\ConfigRepository::class,
'grouping_provider' => null //config can be different by grouping
]

extra_repository 是您的自定义配置仓库 grouping_provider 通过提供此选项,您将能够支持不同的配置分组段。

3). 事件和序列监听器

Laravel提供了一个非常好的事件和监听器系统。但是,对于事件,其监听器的调用是基于监听器注册到系统的时间。如果一个包注册得早,监听器可能也会被提前调用。

alphazento/zento扩展了Laravel的事件和监听器,您只需要在composer.json中配置您的监听器,并为每个监听器定义其序列,然后这些监听器将按照您定义的顺序被调用。

如果一个包为事件“EVENT-CLASS-NAME”定义了一个监听器

"listeners" : {
        "EVENT-CLASS-NAME" : {
            "10":"OBSERVER-CLASS-NAME1"
            }
    },

另一个包为相同的事件“EVENT-CLASS-NAME”定义了一个监听器

"listeners" : {
        "EVENT-CLASS-NAME" : {
            "5":"OBSERVER-CLASS-NAME2"
            }
    },

那么调用顺序将是:OBSERVER-CLASS-NAME2, OBSERVER-CLASS-NAME1

基本事件类和基本监听器类

Zento\Kernel\Booster\Events\BaseEvent Zento\Kernel\Booster\Events\BaseListener

请扩展这些基类,我们将收集事件将由哪些监听器处理以及它们的调用顺序细节。

    // DanamicAttributeFactory::createRelationShipORM(\Zento\Kernel\Booster\Config\ConfigInDB\ORMModel\ConfigItem::class, 
    //     'tcol', ['char', 32], true);
    // // $collection = DanamicAttributeFactory::withDynamicSingleAttribute(\Zento\Kernel\Booster\Config\ConfigInDB\ORMModel\ConfigItem::where('key', 'test'),
    // //     'new_column')->get();
    // DanamicAttributeFactory::createRelationShipORM(\Zento\Kernel\TestModel::class, 
    //     'new_column', ['char', 32], true);
    // DanamicAttributeFactory::createRelationShipORM(\Zento\Kernel\TestModel::class, 
    //     'new_column1', ['char', 32], false);

    // \Zento\Kernel\TestModel::listDynamicAttributes();
    // $collection = \Zento\Kernel\TestModel::where('id', 1)->withDynamicSingleAttribute('new_column')->withDynamicOptionAttribute('new_column1')->first();
    // // $collection = \Zento\Kernel\TestModel::where('id', 2)->withDynamicSingleAttribute('new_column')->first();
    // // echo '<pre>';
    // DanamicAttributeFactory::single($collection, 'new_column')->new('OKOK');
    // DanamicAttributeFactory::option($collection, 'new_column1')->new('this is a test');
    // DanamicAttributeFactory::option($collection, 'new_column1')->setValues(['this is a test', 'newvalue']);

    // $collection = \Zento\Kernel\TestModel::where('id', 1)->withDynamicOptionAttributeet()->first();
    // var_dump($collection->attributesets->attributes);die;