教程: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;
}
}