Anti.Framework 控制台行工具

2.0.1 2024-05-22 18:54 UTC

README

Scrutinizer Code Quality Code Coverage Build Status Code Intelligence Status

这个库是用于通过标准 Zend 框架配置和任何兼容 Psr\ContainerInterface 的依赖注入容器使用 Symfony 控制台组件 的适配器

安装

使用 composer 包管理器

composer require antidot-fw/cli

Antidot 框架

Cli 组件默认安装在 Antidot 框架启动器

Zend Expressive

当我们已经安装了库 Zend Config Aggregator 后,运行 composer require 命令将自动安装 Cli 组件

我们只需创建控制台入口点即可

#!/usr/bin/env php
<?php
// bin/console

declare(strict_types=1);

use Antidot\Cli\Application\Console;

set_time_limit(0);

call_user_func(static function (): void {
    require __DIR__.'/../vendor/autoload.php';
    $container = require __DIR__.'/../config/container.php';
    $console = $container->get(Console::class);

    $console->run();
});

最后,我们将对文件 bin/console 给予执行权限

# Debian systems
chmod +x bin/console

作为独立应用程序

Cli 组件也可以用于创建没有框架的控制台应用程序,我们只需要一个兼容标准 Psr\ContainerInterface 的依赖注入容器实现

假设我们创建了一个以下结构的项目

bin/console
config/container.php
composer.json

作为依赖,我们可以使用 Antidot 框架适配 Aura 容器

# composer.json
{
    "name": "antidot-fw/console-example",
    "description": "Antidot framework console project example",
    "type": "project",
    "require": {
        "antidot-fw/cli": "dev-master",
        "antidot-fw/aura-container-config": "dev-master"
    },
    "require-dev": {
        "symfony/var-dumper": "^4.3"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src"
        }
    }
}

我们创建文件 config/container.php,它必须返回一个配置好的 Psr\ContainerInterface 实例给我们。

<?php
// config/container.php
use Aura\Di\ContainerBuilder;
use Antidot\Aura\Container\Config\ContainerConfig;

// Load configuration
$config = [ 'dependencies' => [], 'console' => [ 'commands' => [] ] ];
// Build container
$builder = new ContainerBuilder();
return $builder->newConfiguredInstance([
    new ContainerConfig(\is_array($config) ? $config : []),
], $builder::AUTO_RESOLVE);

我们需要创建控制台入口点

<?php
// bin/console

declare(strict_types=1);

use Antidot\Cli\Application\Console;

set_time_limit(0);

call_user_func(static function (): void {
    require __DIR__.'/../vendor/autoload.php';
    $container = require __DIR__.'/../config/container.php';
    $console = $container->get(Console::class);

    $console->run();
});

并给它执行权限

# Debian systems
chmod +x bin/console

用法

安装控制台后,我们可以通过带有参数 list 或不带参数执行入口点来查看可用的命令

bin/console

创建命令

要创建控制台命令,您需要创建一个继承自 Symfony\Component\Console\Command\Command 的类

<?php
// src/Console/SomeCommand

declare(strict_types=1);

namespace App\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use SomeDependency;

class SomeCommand extends Command
{
    /**
     * You can inject dependencies by constructor 
     * @var SomeDependency 
     */
    private $dependency;
    
    public function __construct(SomeDependency $dependency) {
        $this->dependency = $dependency;
        parent::__construct();
    }
    
    protected function configure(): void
    {
        $this->setName('some:command:name');
    }
    
    protected function execute(InputInterface $input, OutputInterface $output): void
    {
        $output->writeLn('Hello World!!!');        
    }
}

有关更多信息,您可以查看 Symfony 在此方面的官方文档

配置

配置由三个不同的元素组成:dependenciesconsole.commandsconsole.helper-sets

<?php
$config =  [
   'config_cache_path' => 'var/cache/config-cache.php',
   'dependencies' => [
       'invokables' => [
            SomeCommandClass::class => SomeCommandClass::class,
            SomeHelperSet::class => SomeHelperSet::class,
        ]
   ],
   'console' => [
       'commands' => [
           'some:command:name' => SomeCommandClass::class
       ],
       'helper-sets' => [
            SomeHelperSet::class
        ]
   ]
];