hypery 十一、命令行

教程:Hyperf

symfony/console

composer地址: symfony/console - Packagist

github地址:GitHub - symfony/console: Eases the creation of beautiful and testable command line interfaces

hyperf/command github地址:https://github.com/hyperf/command

一、定义

1.1 自定义

用注释定义类为命令行类,再定义领命名字、注释、参数等。

根据类Hyperf\Command\Command和其父类Symfony\Component\Console\Command\Command,Test1Command重写父类Hyperf\Command\Command::configure(),而symfony\Component\Console\Command\Command中只是定义了configure方法名。

php 复制代码
#Hyperf\Command\Command
use Symfony\Component\Console\Command\Command as SymfonyCommand;
abstract class Command extends SymfonyCommand
{
......
    protected function configure()
    {
        parent::configure();
        if (! isset($this->signature)) {
            $this->specifyParameters();
        }
    }
......
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->enableDispatcher($input);
        $callback = function () {
            ......
                call([$this, 'handle']);
            ......
            return 0;
        };

        if ($this->coroutine && ! Coroutine::inCoroutine()) {
            run($callback, $this->hookFlags);
            return $this->exitCode;
        }

        return $callback();
    }
......
}
php 复制代码
use Hyperf\Command\Annotation\Command;
use Hyperf\Command\Command as HyperfCommand;

/**
 * @Command
 */
#[Command]
class Test1Command extends HyperfCommand
{
    protected $name = "test:first";
    public function configure()
    {
        parent::configure();
        $this->setDescription('Hyperf Demo Command');
    }
    public function handle()
    {
        $str = "123";
        $this->line($str);
    }
}

1.2 使用命令行

php 复制代码
php bin/hyperf.php gen:command 命令名

1.3 设置配置文件

php 复制代码
#config/commands.php
return [
    "App\Command\Test2Command",
];

#App\Command\Test2Command 
namespace App\Command;
use Hyperf\Command\Command as HyperfCommand;

class Test2Command extends HyperfCommand
{
    protected $name = "test:test";

    public function configure()
    {
        parent::configure();
        $this->setDescription('Hyperf Demo Command');
    }

    public function handle()
    {
        $this->line('Hello Hyperf!', 'info');
    }
}


#命令行
php bin/hyperf.php
......
test
  test:first
  test:test           Hyperf Demo Command
    

1.4 symfony/console 使用

php 复制代码
namespace Hyperf\Framework;

use Hyperf\Command\Annotation\Command;
use Hyperf\Contract\ConfigInterface;
use Hyperf\Di\Annotation\AnnotationCollector;
use Hyperf\Framework\Event\BootApplication;
use Psr\Container\ContainerInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Console\Application;

class ApplicationFactory
{
    public function __invoke(ContainerInterface $container)
    {
        if ($container->has(EventDispatcherInterface::class)) {
            $eventDispatcher = $container->get(EventDispatcherInterface::class);
            $eventDispatcher->dispatch(new BootApplication());
        }

        $config = $container->get(ConfigInterface::class);
        //从配置文件中获取
        $commands = $config->get('commands', []);
        // Append commands that defined by annotation.
        $annotationCommands = [];
        //从设置备注的类中获取
        if (class_exists(AnnotationCollector::class) && class_exists(Command::class)) {
            $annotationCommands = AnnotationCollector::getClassesByAnnotation(Command::class);
            $annotationCommands = array_keys($annotationCommands);
        }

        $commands = array_unique(array_merge($commands, $annotationCommands));
        $application = new Application();

        if (isset($eventDispatcher) && class_exists(SymfonyEventDispatcher::class)) {
            $application->setDispatcher(new SymfonyEventDispatcher($eventDispatcher));
        }

        foreach ($commands as $command) {
            $application->add($container->get($command));
        }
        return $application;
    }
}
相关推荐
JaguarJack1 天前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo1 天前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack2 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo2 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack3 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay4 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954484 天前
CTF 伪协议
php
BingoGo6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo7 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php