Domanda

C'è un modo corretto e ufficialmente supportato, per aggiungere i tuoi comandi CLI a un modulo magento 2?Da quello che ho raccolto le tue opzioni sono

    .
  1. Aggiungi la classe di comando all'argomento commands di Magento\Framework\Console\CommandList tramite un file di.xml

  2. Registra il tuo comando tramite \Magento\Framework\Console\CommandLocator::register in un file registration.php o un file cli_commands.php

  3. Nessuna di queste opzioni è benedetta con un @api.Non è chiaro, come sviluppatori di estensione, come dovremmo aggiungere script della riga di comando in modo tale da attaccare la versione alla versione.

    Qualcuno sa se c'è una politica ufficiale magente sul modo giusto ™ per farlo?

È stato utile?

Soluzione

cli_commands.php deve essere utilizzato nel caso in cui il comando venga aggiunto in un pacchetto non modulare. Quindi se il comando è nel modulo ed è OK (previsto) che è disponibile solo quando il modulo è abilitato, è necessario utilizzare di.xml.Se non si desidera aggiungere un modulo e desideri avere solo un pacchetto di compositore arbitrario, è possibile utilizzare cli_commands.php per registrare il comando lì.Certo, dovrebbe essere quindi davvero indipendente da Magento.Oppure, per ora, questo approccio può essere utilizzato per registrare i comandi necessari anche se un modulo è disabilitato (assicurarsi che non si affidasse a nessuna logica del modulo che funzioni solo quando è abilitato).

Altri suggerimenti

Il modo corretto è:

Crea il tuo modulo come fai per qualsiasi tipo di modulo

Basta creare il tuo file registration.php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'My_Module',
    __DIR__
);
.

e crea il tuo file module.xml:

<?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>
.

Aggiungi una voce 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>
.

Crea la tua classe di comando:

<?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!');
    }
}
.

per eseguire il tuo compito digitare solo:

php bin/magento my:command
.

Informazioni sulla compatibilità:

@API non è necessario per i comandi, è utilizzato per i contratti di servizio AFAIK.

Se è necessario lasciarli compatibili, basta utilizzare un API di interfaccia all'interno della scrittura invece di mettere la logica al suo interno.

Ad esempio:

<?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.');
    }
}
.

Se lo avessi ragione, i comandi definiti nella riga di comando su di sono disponibili solo in un'istanza magente installata e anche solo per i moduli Magento (poiché devono essere definiti in DI.XML): https://github.com/magento/magento2/blob /6352f8fbca2cbff8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/magento/framework/console/cli.php#L124

Il Magento \ Framework \ App \ DeploymentConfig :: ISavailable () nel metodo sopra controlli per una data di installazione nella configurazione per controllare un magento installato2: https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/ Quadro / app / deploymentconfig.php # l83 ).

I comandi definiti nel magento \ framework \ console \ commandoLocator dall'altro sono sempre disponibili e possono anche essere definiti da moduli non magenti attraverso il metodo di comando di comando statico :: Registrati in un file automatico automatico da compositore (ad esempio CLI_COMMANDS. PHP)

https:// github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cb7f4555bfcf7f4555bfc60451c/lib/internal/magento/framework/console/cli.php#l130

https:// github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfcf7f4555bfc60451c/lib/internal/magento/framework/console/cli.php#l146

Quindi penso che sia necessario entrambi i metodi e avere il diritto di esistere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top