afonzeca / arun
Arun CLI 微框架,适用于 Php 7.2+
Requires
- php: >=7.2.0
- ext-mbstring: *
- afonzeca/arun-core: 0.45.1-alpha
- doctrine/annotations: ^1.6
- doctrine/doctrine-bundle: ^1.9
- doctrine/doctrine-module: ^2.1
- doctrine/doctrine-orm-module: ^2.1
- php-di/php-di: ^6.0
- symfony/event-dispatcher: ^4.1
- vlucas/phpdotenv: ^2.5
Requires (Dev)
- phpunit/php-invoker: ^2.0
- phpunit/phpunit: ^7.3
Suggests
- spatie/phpunit-watcher: ^1.6
This package is auto-updated.
Last update: 2024-09-21 03:42:55 UTC
README
摘要
- 什么是 Aun?
- 它是神奇的!
- Arun 是如何诞生的?
- 创建 Aun 项目
- 编码教程
- 代码自动生成
- 支持配置文件
- 生成自包含可执行文件 (.phar)
- 支持门面
- 关于内部 Aun 引擎的细节?
- 接下来是什么?
- 许可信息
- 感谢...
- 关于版本
- 联系方式
什么是 Aun?
Arun 是一个用于轻松开发 PHP OOP 编写的 "控制台应用程序" 的微框架。它与其他类似框架/库(如 Symfony Console 组件、Silly 等)有很大不同,因为 Aun 使用 "约定优于配置" 和注释来管理命令和相关代码(您的控制台应用程序)。
Arun 微框架通过使用 容器 和 自动装配(归功于 PHP-DI)以及门面和有组织的树结构,提供“开箱即用”的原生依赖注入支持,以便以简单的方式编写代码。
从 0.43-alpha 版本开始,Arun 可以自动生成代码,以实现快速和简单的开发(有关更多信息,请参阅“代码自动生成”章节)。
项目完成后,您还可以使用嵌入式 gen:phar 操作创建自包含的可执行文件 (.phar)。
请注意,ARUN 已经分为两部分:此项目(Aun “模板”)和“核心”,后者包含项目最重要的部分([https://github.com/afonzeca/arun-core])
免责声明:此产品处于开发早期阶段的原型,可能存在安全问题... 请勿在生产环境中使用
它是神奇的!
您在一个特定的目录中创建一个类(例如,“app/Console/Domains/CommandNameDomain.php”),该类扩展了特定的“DomainCommand”类,然后在类内部定义您的代码中的方法,为每个参数提供类型提示(推荐),为可选参数设置默认值... 您就可以通过 CLI 调用一个新命令,如下所示
./arun YOURCLASSNAME:YOURMETHOD param1 param2 [param3] [param4=withdefaultvalue]
(请参阅“示例”部分以更好地了解其工作原理...)
您还可以使用选项(-i --u=username --password=something --check)。
注意:YOURCLASSNAME 在 Aun 宇宙中被称为“DOMAIN”,YOURMETHOD 被称为“ACTION”...
Arun 会为您完成所有工作... 当被调用时,它将实例化一个对应于“DOMAIN”的对象,并调用对应于“ACTION”的类的对应方法。
每个 CLI 参数都直接映射到 DOMAIN/ACTION 方法本身的每个参数,这是通过 PHP 反射实现的。参数也会在方法声明期间根据指定的类型进行“类型转换”。
另一个 Aun 中的“魔法”是您有一个依赖容器支持(Php-Di),因此您可以在类中轻松注入服务。
最后但同样重要的是,Aun 可以为每个 DOMAIN 和其 ACTION 自动生成帮助文件。您还可以通过“注释”(类内的特殊注释)添加其他信息(帮助文本)。
通过使用注释,还可以定义选项及其帮助描述。
Arun 还支持“开箱即用”的 phar 生成,因此您的软件包将是“自包含”的,并且可以像可执行文件一样安装在您的 /bin、/opt 等。归功于 Box2 支持(请参阅https://github.com/humbug/box)
Arun 是如何诞生的?
阿伦(Arun)是一款创建名为“Sensuikan”的完整工作框架的工具,我在此框架上进行了开发。无论如何,在开发过程中,我意识到阿伦可以作为独立组件使用。因此,我创建了“Arun Microframework Package”。
以下情况下它很有用:
-
您希望以纯PHP OOP风格编写具有最小依赖性的命令行代码(但您需要自动加载composer支持、依赖注入、项目组织良好……即插即用!)
-
您需要重新组织/聚合您的CLI遗留代码,以更健壮的项目,而不必花费时间来管理命令行、参数、值映射等。
-
作为编写自己框架的基础……阿伦可以成为实现“Composer”、“Laravel Artisan”等工具的好候选。
-
您想编写可以从cron、命令行脚本等调用的PHP工作者或服务。
无论如何……说太多话了……现在让我们编写一些代码吧……;-)
创建 Aun 项目
您需要在机器上安装php 7.2和Composer(https://getcomposer.org.cn)(仅在Linux/Ubuntu/Mint上进行测试)。
composer --stability=alpha create-project afonzeca/arun MyFirstArunApplication
注意
-
由于项目处于“alpha”阶段,您必须指定框架的版本,如上所示。
-
从0.41 - alpha版本开始,ArunCore已从Arun中分离出来。“core”将由Composer自动安装(您可以在vendor/afonzeca/arun-core下找到它)。请查看Arun-Core on Github以获取更多详细信息和API库文档。
免责声明:此产品处于早期开发阶段,可能存在稳定性和安全问题……请勿在生产环境中使用
编码教程
阿伦可以自动生成代码,但在接下来的几个示例中,我更喜欢“手工艺”方法,因此我将逐步描述如何手动使用该平台进行开发。
如果您想跳过示例并直接阅读有关自动生成代码的内容(不推荐),请参阅章节'代码自动生成'以获取更多信息。
在开始之前,让我们使用以下内容创建第一个项目:
composer --stability=alpha create-project afonzeca/arun MyFirstArunApplication
cd MyFirstArunApplication
教程1 - 如何编写基本的命令行应用程序
您想实现以下域和操作(对我们来说,它将是一个假函数,仅将消息写入屏幕……)
./arun table:create users
注意:如果您喜欢,您可以更改“arun”可执行文件的名字……但如果您喜欢Arun项目,我会很高兴您保留名字不变 ;-)
无论如何,要开始开发,您需要进行以下操作:
步骤1
在app/Console/Domains文件夹内,您需要添加一个名为"TableDomain.php"的类,其命名空间为"App\Console\Domains"。
该类将继承"DomainCommand"基类,如下所示
<?php namespace App\Console\Domains; use ArunCore\Annotations as SET; /** * Class TableDomain * * @SET\DomainEnabled(true) * @SET\DomainSyn("This Domain allows to interact with tables") * * @package App\Console\Domains */ class TableDomain extends DomainCommand { /** * * @SET\ActionEnabled(true) * @SET\ActionSyn("This action allows to create a table with a specified name") * @SET\ActionOption("--set-key=<name>:Set the primary key name") * @SET\ActionOption("--use-camelCaseForNaming:Use camelCase for defining table name") * * @param string $tableName * * @throws \Exception */ public function create(string $tableName) { $this->cOut->writeln(sprintf("Creating table %s", $tableName)); } }
换句话说...
- 您需要创建一个名为"DOMAINNAME"Domain的类,并必须继承DomainCommand(抽象类)
- 您需要为特定域名(Classname + Domain后缀)创建对应于每个操作的方法。
- CLI中的操作参数将按顺序注入到方法参数中。
CLI中的参数值也将根据您定义的方法参数的类型提示进行“强制类型转换”(请仅使用int、string、float... 数组和对象尚未测试!我不知道会发生什么!)
注意:对每个参数进行类型提示不是强制性的,但建议这样做以减少安全问题。
现在,您可以按照以下方式调用您的新域名并获得帮助
./arun table:create users
阿伦会为您完成这项工作...
./arun table Arun Microframework 0.45-alpha - (C) 2018 by Angelo Fonzeca (Apache License 2.0) Table: This Domain allows to interact with tables Usage: table:ACTION [options] [arguments] Where ACTIONs are: create Description: This action allows to create a table with a specified name Parameters : <tableName> [primaryKey=id] [defaultDb=mydb]
教程2 - 在继续之前……注解是如何工作的?
如上例所示,在注释中有@SET\SomeThing(它们被称为“注解”)(它们也用于PhpDoc……如果您熟悉的话)。
它们是指令,允许Arun获取有关将要用于在运行时定义一些行为的类和方法的信息。
当你使用Arun时,一些注解是必需的(只有2个)
@SET\DomainEnabled(param)
其中param是"true"或"false"。
这允许在设置为true时,通过Arun将类作为"领域"从命令行调用。它还允许框架在帮助信息中显示命令。
注意:此注解/指令仅在类顶部有效,否则你会收到异常!
@SET\ActionEnabled(param)
其中param是"true"或"false"。
这允许在Arun中从命令行以"操作"调用方法。其行为与前面的注解类似。
注意:此注解/指令仅在方法顶部有效,否则你会收到异常!
对于类将只有一个DomainEnabled,对于每个必须被视为"操作"(可从CLI调用)的方法,将有多多个ActionEnabled。
其他注解不是必需的。
@SET\DomainSyn("some spaced text...")
@SET\ActionSyn("some spaced text...")
在需要时定义领域或操作的描述。
最后的注解是
@SET\ActionOption("--optionName=<something>:description")
它允许你为每个操作定义选项(注意:当前选项对领域中的所有操作都是可见的),这个指令目前仅用于帮助信息。对于操作(方法)可以多次出现ActionOption指令,因此你可以定义多个选项。
教程3 - 可选参数
设置可选参数很容易...对你的方法参数进行类型提示并设置默认值...例如
public function create(string $tableName, string $primaryKey="id", string $defaultDb="mydb") { // It will print "users" because it is the parameter passed from CLI printf("Default Db %s\n",$defaultDb); // your code here printf("Primary key %s\n",$primaryKey); // your code here printf("Creating table...%s\n",$tableName); // your code here //.... //other code... //.... } }
现在你可以用1个、2个或3个参数调用Arun...
如果你输入./arun table:create不带有参数,你会收到自动帮助...如下
Arun Microframework 0.45-alpha - (C) 2018 by Angelo Fonzeca (Apache License 2.0)
Table: Table creation
Usage:
table:ACTION [options] [arguments]
Where ACTIONs are:
create
Description: This action allows to create a table with a specified name
Parameters : <tableName> [primaryKey=id] [defaultDb=mydb]
Option : --set-key=<name> ( Set the primary key )
Option : --use-camelCaseForNaming ( Use camelCase for defining table name )
如果你输入./arun不带命令、操作等,你会收到一个"全局帮助"如下
Arun Microframework 0.45-alpha - (C) 2018 by Angelo Fonzeca (Apache License 2.0)
Default: A Convention Over Configuration CLI Micro-Framework
Usage:
DOMAIN:ACTION [options] [arguments]
Available DOMAINS (set of aggregate commands) are:
default: A Convention Over Configuration CLI Micro-Framework
producer: Generate Producer Classes!
table: Table creation
Please write ./arun DOMAIN:help to list the ACTIONS available for a DOMAIN
教程4 - 使用选项(如--i --value="xyz" --check-db -u="root")
arun支持选项(短和长),但格式必须是-i=something和--optionIlike=something,不带"="的格式不支持(例如'-i something')。
你可以在任何时候使用你的选项(在领域:操作之后、中间或末尾)。
这样的命令都是有效的
.\arun table:create bills id1 db2 -i --pk="id" --create-fks -u="root"
.\arun -i --pk="id" --create-fks table:create -i bills id1 db2 -u="root"
选项对于特定领域(类)是全局的,可以从其中的每个操作(方法)中访问。是否检查一个选项对你的方法/操作是否必要或相关,取决于你。
好消息是,你不需要设置任何东西!它会自动工作。
要访问选项,你可以使用以下方法从你的领域类
-
hasOption用于检查选项的存在
-
getOptionValue用于获取选项值(对于像"-i"这样的void选项,你会收到一个空字符串...如果选项不存在,你会收到"false"布尔类型 - 因此调用hasOption或检查是否不等于false - )。
在我们之前的例子中,将以下代码添加到上面的"create"方法中
if($this->hasOption("u")){ printf("The value of -u is %s\n",$this->getOptionValue("u")); }
输出将是
./arun -i --pk="id" --create-fks -u bills x abc -u="root"
Default Db abc
Primary key x
Creating table...bills
The value of -u is root
教程5 - 如何注入某些内容
Arun也支持从容器进行依赖注入。
在"containers"文件夹中,你会找到
- core.php,其中包含Arun工作的内部服务的内部引用
- app.php,它允许你定义和使用你的服务(并通过di容器和php-di注入它们)
所以,编辑container/app.php文件...它包含一个空数组...现在我将解释如何填充它!
例如...我们想在应用中有一个记录器...最好的办法是在容器中配置它,然后在构造函数中注入它(构造函数注入)。
困难吗?不,一点也不!让我们开始吧!
步骤1
使用Composer安装monlog
composer require monolog/monolog
第二步
编辑你的containers/app.php...并将其内容替换为以下内容
<?php use Monolog\Logger; use Monolog\Handler\StreamHandler; use Monolog\Formatter\LineFormatter; return [ Psr\Log\LoggerInterface::class => DI\factory(function () { $logger = new Logger('mylog'); $fileHandler = new StreamHandler('app/var/mylog.log', Logger::DEBUG); $fileHandler->setFormatter(new LineFormatter()); $logger->pushHandler($fileHandler); return $logger; }), ];
第三步
现在请在您的 TableDomain.php 文件中替换以下代码内容
<?php namespace App\Console\Domains; use ArunCore\Annotations as SET; /** * Class TableDomain * * @SET\DomainEnabled(true) * @SET\DomainSyn("This Domain allows to interact with tables") * * @package App\Console\Domains */ class TableDomain extends DomainCommand { /** * TableDomain constructor. * @param \Psr\Log\LoggerInterface $logger */ protected $logger; public function __construct(\Psr\Log\LoggerInterface $logger) { $this->logger = $logger; } /** * * @SET\ActionEnabled(true) * @SET\ActionSyn("This method says hello to a specified name") * @SET\ActionOption("--set-key=<name>:Set the primary key name") * @SET\ActionOption("--use-camelCaseForNaming:Use camelCase for defining table name") * @SET\ActionOption("--u=<value>:Set username to be used for the RDBMS") * @SET\ActionOption("--l=<value>:Logs something") * * @param string $tableName * * @throws \Exception */ public function create(string $tableName, string $primaryKey = "id", string $defaultDb = "mydb") { // It will print "users" because it is the parameter passed from CLI printf("Default Db %s\n", $defaultDb); // your code here printf("Primary key %s\n", $primaryKey); // your code here printf("Creating table...%s\n", $tableName); // your code here //.... //other code... //.... if ($this->hasOption("u")) { printf("The value of -u is %s\n", $this->getOptionValue("u")); } if ($this->hasOption("l")) { $this->logger->error($this->getOptionValue("l")); } } }
换句话说,需要在构造函数中包含 LoggerInterface(正确的方法!),它将在应用程序启动时由 Arun 通过 di-container 注入!
多亏了构造函数,日志对象存储在 $logger 属性中,因此可以从其他方法访问它。
protected $logger; public function __construct(\Psr\Log\LoggerInterface $logger) { $this->logger = $logger; }
多亏了 "create" 方法中的以下代码,每次调用 Arun 时带有 "-l" 参数,都会在日志中写入一行记录
if ($this->hasOption("l")) { $this->logger->error($this->getOptionValue("l")); }
如果您运行 Arun,结果将是
./arun -i --pk="id" --create-fks -u="root" table:create -p bills x abc -u="root" -l="Test1"
Default Db abc
Primary key x
Creating table...bills
The value of -u is root
如果您检查 app/var/mylog.log,您将找到 "-l" 选项的值(Test1)。
有关 Arun 内部使用依赖注入的更多信息,请参阅 Matthieu Napoli 和贡献者提供的 https://PHP-DI.org/。
教程 6 - ExampleDomain
Arun 包内有一个名为 "ExampleDomain.php" 的文件(位于 app/Console/Domains),可以用作您领域开发的起点。它还展示了未记录的功能。
请随意删除它!
代码自动生成
ARUN 可以自动生成 DOMAIN 类和 ACTION 方法的代码。注释和 PHPDOC 兼容的注释也会生成。
ARUN 内置了一个名为 "gen" 的领域,专门用于代码生成。让我们看看帮助指南
./arun gen
Arun Microframework 0.45-alpha - (C) 2018 by Angelo Fonzeca (Apache License 2.0)
Gen: Generates code for Arun Development Speed-up
Usage:
gen:ACTION [options] [arguments]
Where ACTIONs are:
domain
Description: This action generates a Domain class for Arun automatically
Parameters : <domainName>
Option : --synopsis='your domain description' ( Set the description of the domain )
Option : --disabled ( Generate the Domain class file but with DomainEnabled set to FALSE )
Option : -f|--force ( Force domain code overwriting - NOTE! It will destroy your hand-made code! - )
action
Description: This action generates ARUN CODE for an Action linked to a Domain class
Parameters : <domainName> <actionName>
Option : --synopsis='your action description' ( Set the description of the action )
Option : --disabled ( Generate the Action method but disabled )
parameter
Description: This action adds a parameter to a specified action(method) linked to a domain(class)
Parameters : <domainName> <actionName> <paramName>
Option : --type='int|string' ( Set the 'type'. Otherwise the type will be 'string' )
Option : --default='your default value' ( Otherwise the value will be not set. )
如你所见,目前它可以为您生成参数化的领域和动作(选项将在下一版本中包含)。
在下一段中,您将找到一些示例。
注意:出于安全考虑,可以禁用 "gen" 领域。请访问 "app/Console/Domains/GenDomain.php",在您的应用程序中取消激活领域,通过修改注释 @SET\DomainEnabled(true) 为 @SET\DomainEnabled(false)
生成领域
根据上一章教程中的代码,让我们使用自动生成的 "gen" 领域(如前所述,当安装 Arun 框架时 "out-of-the-box" 存在)生成 "TableDomain" 命令集和 "create" 动作。请参阅第一章的教程 1 以获取上一章的代码细节。
./arun gen:domain Table --synopsis="This Domain allows to interact with tables" Generating Table for you. * Synopsis set to "This Domain allows to interact with tables" Done! Please check app/Console/Domains/TableDomain.php
以下代码将在 app/Console/Domains/TestDomain.php 中生成
<?php /** * This file TableDomain.php has been generated by "Arun - CLI Microframework for Php7.2+" released under the following terms * * Copyright 2018 Angelo FONZECA ( https://www.linkedin.com/in/angelo-f-1806868/ ) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://apache.ac.cn/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Linkedin contact ( https://www.linkedin.com/in/angelo-f-1806868/ ) - Project @ https://github.com/afonzeca/arun * * Code Example made using the Arun CLI Micro-framework for PHP7.2+ * */ namespace App\Console\Domains; use ArunCore\Annotations as SET; /** * Class TableDomain - This Domain allows to interact with tables * * @SET\DomainSyn("This Domain allows to interact with tables") * @SET\DomainEnabled(true) * * @SET\DomainEOA("TableDomain") */ class TableDomain extends DomainCommand { }
如你所见,你的新领域已经准备好了!
重要提示
- 如果您需要 "重新生成" 类,请使用 -f 或 --force 选项(注意!它将破坏您手动编写的代码!)
- 绝对不要从代码中移除 @SET\DomainEOA 或 @SET\ActionEOA,它们是 "gen" 领域的占位符!否则它将不会工作。
- 如果您想手动编写 Arun 代码,并且将来想使用 "gen" 领域的动作,请记住添加上述注释
生成动作
让我们根据上一章的说明生成 "create" 动作!
./arun gen:action Table create --synopsis="This action allows to create a table with a specified name" Generating action Create for you. * Synopsis set to "This action allows to create a table with a specified name" Action created! Please check app\Console\Domains\TableDomain.php for adding your code
注意:命令和参数是区分大小写的
让我们看看生成的代码
<?php ... ... ... namespace App\Console\Domains; use ArunCore\Annotations as SET; /** * Class TableDomain - This Domain allows to interact with tables * * @SET\DomainSyn("This Domain allows to interact with tables") * @SET\DomainEnabled(true) * * @SET\DomainEOA("TableDomain") */ class TableDomain extends DomainCommand { /** * * create - This action allows to create a table with a specified name * * @SET\ActionEnabled(true) * @SET\ActionSyn("This action allows to create a table with a specified name") * * @SET\ActionEOA("create") */ public function create() { $this->cOut->writeln("This action must be defined."); } }
让我们将 create() 中的代码替换为以下内容
$this->cOut->writeln(sprintf("Creating table %s", $tableName));
注意:创建动作时,如果您再次使用相同动作名称运行 Arun,则不会替换它。如果您需要替换它,您必须首先手动删除领域代码中的动作。否则,您将得到如下错误
./arun gen:action Table create --synopsis="This action allows to create a table with a specified name" Action create is already present! Please remove it manually from the code and start the process again.
添加参数
./arun gen:parameter Table create tableName --type="string" Adding parameter tableName to action Table@create for you. Parameter created! Please check app\Console\Domains\TableDomain.php for adding your code
让我们看看代码...
use ArunCore\Annotations as SET; /** * Class TableDomain - This Domain allows to interact with tables * * @SET\DomainSyn("This Domain allows to interact with tables") * @SET\DomainEnabled(true) * * @SET\DomainEOA("TableDomain") */ class TableDomain extends DomainCommand { /** * * create - This action allows to create a table with a specified name * * @SET\ActionEnabled(true) * @SET\ActionSyn("This action allows to create a table with a specified name") * * @var string $tableName * @SET\ActionEOA("create") */ public function create(string $tableName) { $this->cOut->writeln(sprintf("Creating table %s", $tableName)); } }
注意:如果您在相同动作上使用相同参数名称再次运行 Arun,则不会替换该参数。如果您需要替换它,您必须首先手动删除动作代码中的参数。否则,您将得到如下错误
/arun gen:parameter Table create defaultDb --type="string" --default="mydb" Adding parameter defaultDb to action Table@create for you. Default value mydb Arun EXCEPTION: Parameter already exists!
添加具有值的参数
根据上一章的教程 3,让我们添加 "primarykey" 和 "defaultDb" 参数及其默认值...
./arun gen:parameter Table create primaryKey --type="string" --default="id" Adding parameter primaryKey to action Table@create for you. Default value id Parameter created! Please check app\Console\Domains\TableDomain.php for adding your code
./arun gen:parameter Table create defaultDb --type="string" --default="mydb" Adding parameter defaultDb to action Table@create for you. Default value mydb Parameter created! Please check app\Console\Domains\TableDomain.php for adding your code
结果将是
use ArunCore\Annotations as SET; /** * Class TableDomain - This Domain allows to interact with tables * * @SET\DomainSyn("This Domain allows to interact with tables") * @SET\DomainEnabled(true) * * @SET\DomainEOA("TableDomain") */ class TableDomain extends DomainCommand { /** * * create - This action allows to create a table with a specified name * * @SET\ActionEnabled(true) * @SET\ActionSyn("This action allows to create a table with a specified name") * * @var string $tableName * @var string $primaryKey='id' * @var string $defaultDb='mydb' * @SET\ActionEOA("create") */ public function create(string $tableName, string $primaryKey='id', string $defaultDb='mydb') { $this->cOut->writeln(sprintf("Creating table %s", $tableName)); } }
尚未在 "gen" 中实现动作
- 如果您需要添加如 (--i, --value='default',等) 选项,您需要手动添加它们...(目前是这样)
所以请根据上面的示例在其他的注释 (@SET) 下方添加以下代码
* @SET\ActionOption("--set-key=<name>:Set the primary key name") * @SET\ActionOption("--use-camelCaseForNaming:Use camelCase for defining table name")
请参阅教程 5 了解 "options" 管理
- 要在“依赖注入容器”内添加服务,请参考前一章中展示的教程配置。
支持配置文件
对于静态配置,Arun 使用通过全局函数 "Conf()" 可访问的 "config/config.php" 文件。
无论如何,它默认支持 ".env" 文件,这得益于 VLucas 的 PhpDotEnv 库(https://github.com/vlucas/phpdotenv)
特别参考 .envcli 文件来配置 Arun!
如果您需要使用您的参数扩展 .envcli 文件,请在您的代码中使用 getenv("KEY"),其中 "KEY" 是您的 env 变量的键(目前 Arun 不对 .envcli 文件使用缓存……因此您可以直接使用它)
注意事项
Arun 有许多未记录的函数、内部功能和其它有用的东西……文档将尽快改进!;-)
生成自包含可执行文件 (.phar)
Arun 支持 "phar" 生成,归功于 Box2 和自准备的配置 "box.json" 文件。
生成 phar 需要三个步骤
- 在您的项目内创建一个 bin 目录并使用以下命令更改目录:
mkdir bin
cd bin
- 使用 wget 或其它工具下载 bin/ 中的 "box.phar" 可执行文件(从 [https://github.com/humbug/box/releases] 下载)。例如 [https://github.com/humbug/box/releases/download/3.3.1/box.phar]
- 设置执行权限并进入您的项目根目录
chmod 755 box.phar
cd ..
- 现在您可以运行以下命令来生成您的 myApp.phar
./arun gen:phar
-
在您的项目 var/boxed 下,您将找到您的 myApp.phar……
-
根据您的需要重命名它,带有或不带有 .phar 扩展名,并将其移动到您首选的位置
注意
-
默认情况下,"gen" 和 "example" 域在您生成的 .phar 应用程序中已禁用
-
如果您需要使用您的生成的 .phar 应用程序编写/编辑/操作文件,请记住在您的代码中指定绝对路径,并/或使用 "getcwd" 函数。
__DIR__
将指向包内的路径,并且您的代码将无法在该 "box" 外部运行。
支持门面
Arun 支持其内部核心类的一个简单 Facades 实现。
要使用它们,请在您的类中包含它们的命名空间,使用 "use" 语句。
基本命名空间是 "ArunCore\Facades...FacadeName...",其中 "...FacadeName..." 是以下之一
- ActionManipulator ("ArunCore\Core\CodeBuilders\ActionManipulator")
- ContentGenerator ("ArunCore\Core\IO\FileContentGenerator")
- Core ("ArunCore\Core\ArunCore")
- DomainManipulator ("ArunCore\Core\CodeBuilders\DomainManipulator")
- Executor ("ArunCore\Core\Domain\DomainActionExecutor")
- HelpGenerator ("ArunCore\Core\CodeBuilders\ActionManipulator")
- Input ("ArunCore\Core\IO\ConsoleInput")
- LLHelper ("ArunCore\Core\Helpers\LowLevelHelper")
- NameGenerator ("ArunCore\Core\Domain\DomainActionNameGenerator")
- Output ("ArunCore\Core\IO\ConsoleOutput")
- Sanitizer ("ArunCore\Core\Helpers\Sanitizer")
您可以通过这种方式使用 Facade
$isClassNameValid = Sanitizer::isClassNameValid("Hello");
关于内部 Aun 引擎的细节?
当您调用 Arun 时,它执行以下步骤(这不是黑魔法 :D)
- 配置并获取 DI 容器,启动 "ConsoleInput" 并处理参数
- 从容器注入一些依赖项
- 对参数进行一些安全检查(例如,删除一些字符和其他检查)——代码已编写但尚未支持
- 通过反射分析 ACTION 请求的结构(例如,参数的类型提示和数量)
- 检查是否定义了类或方法注释
- 如果检查通过,框架获取与 DOMAIN(在我们的例子中是 "table")对应的类,它使用工厂来实例化类
- 在 ACTION 方法(例如 create)内部,Arun 注入传递的参数(如果需要,也注入容器中的依赖项到构造函数)
- 调用 ACTION 方法(例如 create)……
- 如果出现错误,将显示上下文帮助(通过反射,框架将根据传递的参数和注释描述 DOMAIN 和 ACTION)
Arun 是按照 S.O.L.I.D. 原则(呃……我尽力做到了 ;-)),一些 12factors 原则和完全面向对象的方法编写的!
请随意浏览代码,它已经完全文档化!
开发者注意
Arun 包含一个 phpunit.xml 文件,因此您可以直接在开发过程中使用 PhpUnit 和 Spatie 的 PhpUnitWatcher!
我还对核心部分(在 vendor/afonzeca/arun-core 下)编写了一些单元测试,您可以在 tests 目录中找到它们,以便更好地理解 Arun 的工作方式!
接下来是什么?
未来的版本有望包括以下内容:
- 支持全彩、表格和花哨的功能,以便输出信息
- 安全改进
- 更完整和全面的单元测试
- 强制或“可选”选项
- MVC 支持(我将在未来解释这个想法 ;-))
- 子命令
- 许多其他未在此列出的功能
请参阅包内的“changelog.txt”文件,以检查与前一个版本的更改。
许可信息
此文件是“Arun - CLI 微型框架,适用于 Php7.2+”的一部分,根据以下条款发布:
版权所有 2018 Angelo FONZECA ( https://www.linkedin.com/in/angelo-f-1806868/ )
根据 Apache License 2.0 许可(“许可”);除非您遵守许可规定,否则不得使用此文件。您可以在以下位置获取许可副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可下分发的软件按“原样”分发,不提供任何明示或暗示的保证或条件。请参阅许可了解具体的管理权限和限制。
感谢...
-
我亲爱的妻子 Carla!我爱你!
-
我的朋友 LucaM. 来自 TGG ;-)
-
重金属
-
Clive Sinclair 先生、Tony Tebby、Adriano Olivetti、Brian Kernighan 和 Dennis Ritchie... 他们是真正的 IT 英雄!
关于版本
项目链接: https://github.com/afonzeca/arun(第一个项目版本链接: https://github.com/afonzeca/bosun )
主核心库: https://github.com/afonzeca/arun-core
请参阅包内的 changelog.txt 文件以了解框架改进的详细信息。
联系方式
保持联系!我的 LinkedIn 联系方式 https://www.linkedin.com/in/angelo-f-1806868/
非常感谢您对 Arun 的兴趣!Angelo Fonzeca