afonzeca/arun

Arun CLI 微框架,适用于 Php 7.2+

v0.45.1-alpha 2018-11-06 00:00 UTC

README

摘要

什么是 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”。

以下情况下它很有用:

  1. 您希望以纯PHP OOP风格编写具有最小依赖性的命令行代码(但您需要自动加载composer支持、依赖注入、项目组织良好……即插即用!)

  2. 您需要重新组织/聚合您的CLI遗留代码,以更健壮的项目,而不必花费时间来管理命令行、参数、值映射等。

  3. 作为编写自己框架的基础……阿伦可以成为实现“Composer”、“Laravel Artisan”等工具的好候选。

  4. 您想编写可以从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"

选项对于特定领域(类)是全局的,可以从其中的每个操作(方法)中访问。是否检查一个选项对你的方法/操作是否必要或相关,取决于你。

好消息是,你不需要设置任何东西!它会自动工作。

要访问选项,你可以使用以下方法从你的领域类

  1. hasOption用于检查选项的存在

  2. 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"文件夹中,你会找到

  1. core.php,其中包含Arun工作的内部服务的内部引用
  2. 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" 中实现动作

  1. 如果您需要添加如 (--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" 管理

  1. 要在“依赖注入容器”内添加服务,请参考前一章中展示的教程配置。

支持配置文件

对于静态配置,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
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