Der richtige Weg ist:
Erstellen Sie Ihr Modul wie für jede Art von Modul
Erstellen Sie einfach Ihre registration.php
Datei
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'My_Module',
__DIR__
);
Und erstellen Sie module.xml
Ihre Datei:
<?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>
Fügen Sie einen Eintrag hinzu in 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>
Erstellen Sie Ihre Befehlsklasse:
<?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!');
}
}
Um Ihre Aufgabe auszuführen, geben Sie einfach Folgendes ein:
php bin/magento my:command
Informationen zur Kompatibilität:
@api wird für Befehle nicht benötigt, es wird für Serviceverträge AFAIK verwendet.
Wenn Sie sie kompatibel lassen möchten, verwenden Sie einfach eine Schnittstellen-API in Ihrem Skript, anstatt die Logik darin zu platzieren.
Zum Beispiel:
<?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
Wenn ich es richtig verstanden habe, sind in der Befehlsliste über DI definierte Befehle nur in einer installierten Magento-Instanz und auch nur für Magento-Module verfügbar (da sie in der Datei di.xml definiert werden müssen): https://github.com/magento /magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L124
Magento \ Framework \ App \ DeploymentConfig :: isAvailable () in der obigen Methode sucht in der Konfiguration nach einem Installationsdatum, um nach einem installierten Magento2 zu suchen: https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451 intern / Magento / Framework / App / DeploymentConfig.php # L83 ).
Die im Magento \ Framework \ Console \ CommandLocator definierten Befehle sind dagegen immer verfügbar und können sogar von Nicht-Magento-Modulen über die statische CommandLocator :: register-Methode in einer vom Composer automatisch geladenen Datei (z. B. cli_commands.php) definiert werden.
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
Ich denke also, dass beide Methoden benötigt werden und das Recht haben zu existieren
quelle