在这篇文章里,我们将了解如何将命令行添加到 Magento2 控制台命令行界面中。Magento2 添加命令行后可以使用界面快速更改某些功能,如:
-
安装 Magento(和相关任务,如创建和更新数据库架构,新建部署配置等等)
-
清除缓存
-
管理索引,包括重建
-
新建翻译字典和翻译包
-
为插件生成不存在的类,如工厂类和拦截器类 ;为对象管理器生成依赖注入配置
-
部署静态视图文件
-
从 LESS 生成 CSS
在开始之前,请花费几分钟去了解一下在 Magento2 命令行界面的命名。
我们将会使用 Mageplaza_HelloWorld 这个模块来进行演示。
要向Magento 2 命令行界面添加选项,我们将执行以下步骤:
第一步:在 di.xml 文件中定义命令
在 di.xml 文件中,可以使用名为 Magento\Framework\Console\CommandList 的类型来定义命令选项
文件: app/code/Mageplaza/HelloWorld/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\Console\CommandList">
<arguments>
<argument name="commands" xsi:type="array">
<item name="exampleSayHello" xsi:type="object">Mageplaza\HelloWorld\Console\Sayhello</item>
</argument>
</arguments>
</type>
</config>
此配置声明了一个命令类 Sayhello ,这个类定义了命令的名字和方法 execute() 。
第二步:创建命令类
因为在 di.xml 文件中进行了定义,所以现在创建一个命令类:
文件: app/code/Mageplaza/HelloWorld/Console/Sayhello.php
<?php
namespace Mageplaza\HelloWorld\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Sayhello extends Command
{
protected function configure()
{
$this->setName('example:sayhello');
$this->setDescription('Demo command line');
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln("Hello World");
}
}
在这函数中,定义两个方法:
-
configure() 方法用来设置 magento2 添加命令行的名称,描述,命令行参数
-
当通过控制台使用命令时侯,execute() 方法就会被调用执行
声明类后,请刷新 Magento 缓存并且输入以下命令:
php magento --list
你将会看到整个命令列表。命令如下
现在你可以执行 bin/magento example:sayhello 命令并查看结果
现在,我们为命令添加一些参数。
内容如下:
<?php
namespace Mageplaza\HelloWorld\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
class Sayhello extends Command
{
const NAME = 'name';
protected function configure()
{
$options = [
new InputOption(
self::NAME,
null,
InputOption::VALUE_REQUIRED,
'Name'
)
];
$this->setName('example:sayhello')
->setDescription('Demo command line')
->setDefinition($options);
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
if ($name = $input->getOption(self::NAME)) {
$output->writeln("Hello " . $name);
} else {
$output->writeln("Hello World");
}
return $this;
}
}
我们在 configure() 函数里为命令定义了参数 name 并在 execute() 函数中获取了它。请清除缓存并在命令行中执行 php bin/magento example:sayhello --name=“Join” ,查看执行结果为 “Hello Join” 。