Cara yang benar adalah:
Buat modul Anda seperti halnya modul apa pun
Cukup buat registration.php
file Anda
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'My_Module',
__DIR__
);
Dan buat module.xml
file Anda :
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="My_Module" setup_version="0.1.0">
</module>
</config>
Tambahkan entri di 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="my_command" xsi:type="object">My\Module\Command\Mycommand</item>
</argument>
</arguments>
</type>
</config>
Buat kelas perintah Anda:
<?php
namespace My\Module\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Mycommand extends Command
{
protected function configure()
{
$this->setName('my:command');
$this->setDescription('Run some task');
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln('Hello world!');
}
}
Untuk menjalankan tugas Anda cukup ketik:
php bin/magento my:command
Tentang kompatibilitas:
@api tidak diperlukan untuk perintah, itu digunakan untuk kontrak layanan AFAIK.
Jika Anda harus membiarkannya kompatibel, cukup gunakan antarmuka API di dalam skrip Anda alih-alih memasukkan logika di dalamnya.
Sebagai contoh:
<?php
use My\Module\Api\TaskInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class MyCommand extends Command
{
protected $taskInterface;
public function __construct(
TaskInterface $taskInterface
) {
$this->taskInterface= $taskInterface;
parent::__construct();
}
protected function configure()
{
$this->setName('my:command');
$this->setDescription('Run some task');
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->taskInterface->runTask();
$output->writeln('Done.');
}
}
Magento\Framework\Console\CommandList
jika saya melakukannya dengan benar, perintah yang didefinisikan dalam CommandList lebih dari DI hanya tersedia di Instance Magento diinstal dan juga hanya untuk Modul Magento (karena mereka harus didefinisikan dalam di.xml): https://github.com/magento /magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L124
Magento \ Framework \ App \ DeploymentConfig :: isAvailable () dalam metode di atas memeriksa Tanggal instalasi di Config untuk memeriksa Magento2 yang diinstal: https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc6045c/ internal / Magento / Framework / App / DeploymentConfig.php # L83 ).
Perintah yang didefinisikan dalam Magento \ Framework \ Console \ CommandLocator di sisi lain selalu tersedia dan bahkan dapat didefinisikan oleh Modul non Magento melalui CommandLocator :: metode register statis dalam file yang dimuat secara otomatis oleh komposer (misalnya cli_commands.php)
https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L130
https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L146
Jadi saya pikir kedua metode ini diperlukan dan memiliki hak untuk hidup
sumber