教程: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方法名。
#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();}
……
}
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 bin/hyperf.php gen:command 命令名
1.3 设置配置文件
#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
……
testtest:firsttest:test Hyperf Demo Command
1.4 symfony/console 使用
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;}
}