在 Magento2 中增加命令行

在这篇文章里,我们将了解如何将命令行添加到 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 命令并查看结果
image
现在,我们为命令添加一些参数。

内容如下:

<?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” 。

本教程翻译自Mageplaza模块开发系列,其他内容请点击下面链接: