Co-authored-by: 李铭昕 <715557344@qq.com>
4.2 KiB
Command
The default command component of Hyperf provided by hyperf/command component,And this component is a abstraction of symfony/console.
Installation
This component usually exists by default, but if you want to use it for non-Hyperf projects, you can also rely on the hyperf/command component with the following command:
composer require hyperf/command
Command List
Run php bin/hyperf.php
without any arguments directly is to display the command list.
Custom Command
Generate a Command
If you have the hyperf/devtool component installed, you can generate a custom command with the gen:command
command:
php bin/hyperf.php gen:command FooCommand
After executing the above command, a configured FooCommand
class will be generated in the app/Command
folder.
Definition of Command
There are three forms of commands that define the command class. The first is defined by the $name
property, the second is defined by the constructor argument, and the last is defined by annotations. We demonstrate this through code examples, assuming we want to define the command. The class command is foo:hello
:
Define the command by $name
property:
<?php
declare(strict_types=1);
namespace App\Command;
use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
#[Command]
class FooCommand extends HyperfCommand
{
/**
* The command
*
* @var string
*/
protected ?string $name = 'foo:hello';
}
Define the command by constructor:
<?php
declare(strict_types=1);
namespace App\Command;
use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
#[Command]
class FooCommand extends HyperfCommand
{
public function __construct()
{
parent::__construct('foo:hello');
}
}
Define the command by annotations:
<?php
declare(strict_types=1);
namespace App\Command;
use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
#[Command(name: "foo:hello")]
class FooCommand extends HyperfCommand
{
}
Define the logic of the command
The logic that the command class actually runs depends on the handle
method inside the code, which means that the handle
method is the entry point to the command.
<?php
declare(strict_types=1);
namespace App\Command;
use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
#[Command]
class FooCommand extends HyperfCommand
{
/**
* The command
*
* @var string
*/
protected ?string $name = 'foo:hello';
public function handle()
{
// Output Hello Hyperf. in the Console via the built-in method line()
$this->line('Hello Hyperf.', 'info');
}
}
Define the arguments of the command
When writing a command, the user's input is usually collected by parameter
and option
, and the parameter
or option
must be defined before collecting a user input.
Parameter
Suppose we want to define a name
parameter, and then pass the arbitrary string such as Hyperf
to the command and execute php bin/hyperf.php foo:hello Hyperf
to output Hello Hyperf
. Let's demonstrate it by code:
<?php
declare(strict_types=1);
namespace App\Command;
use Hyperf\Command\Annotation\Command;
use Hyperf\Command\Command as HyperfCommand;
use Symfony\Component\Console\Input\InputArgument;
#[Command]
class FooCommand extends HyperfCommand
{
/**
* The command
*
* @var string
*/
protected ?string $name = 'foo:hello';
public function handle()
{
// Get the name argument from $input
$argument = $this->input->getArgument('name') ?? 'World';
$this->line('Hello ' . $argument, 'info');
}
protected function getArguments()
{
return [
['name', InputArgument::OPTIONAL, 'Here is an explanation of this parameter']
];
}
}
Execute php bin/hyperf.php foo:hello Hyperf
command and we can see Hello Hyperf
display on Console.