alphazento / zento
Alphazento 框架支持
Requires
- php: >=7.0
- illuminate/routing: 5.7.x|5.8.x|6.0.x|7.x.x
- illuminate/session: 5.7.x|5.8.x|6.0.x|7.x.x
- illuminate/support: 5.7.x|5.8.x|6.0.x|7.x.x
- jaybizzle/crawler-detect: ^1.2
- mobiledetect/mobiledetectlib: ^2.8
Requires (Dev)
- illuminate/framework: 5.7.x|5.8.x|6.0.x|7.x.x
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 创建私有包。
此包还提供了一些有用的功能
- 配置系统,可以连接到数据库(或您也可以定义自己的配置扩展)
- 动态属性、事件和序列监听器。
通过运行命令启用此包
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;