Cách chính xác, được hỗ trợ để thêm các lệnh CLI vào Magento 2


9

Có cách nào chính xác và được hỗ trợ chính thức để thêm các lệnh CLI của bạn vào mô-đun Magento 2 không? Từ những gì tôi đã thu thập các tùy chọn của bạn là

  1. Thêm lớp lệnh của bạn vào commandsđối số Magento\Framework\Console\CommandListthông qua một di.xmltệp

  2. Đăng ký lệnh của bạn thông qua \Magento\Framework\Console\CommandLocator::registertrong một registration.phptập tin hoặc một cli_commands.phptập tin

Không có lựa chọn nào trong số này được ban phước với một @api. Không rõ ràng, với tư cách là nhà phát triển tiện ích mở rộng, làm thế nào chúng ta nên thêm các tập lệnh dòng lệnh sao cho chúng sẽ gắn quanh phiên bản với phiên bản.

Có ai biết nếu có một chính sách Magento chính thức về cách thức Phải để làm điều này không?

Câu trả lời:


6

cli_commands.phpnên được sử dụng trong trường hợp lệnh được thêm vào trong một gói không mô-đun. Vì vậy, nếu lệnh nằm trong mô-đun và nó ổn (dự kiến) chỉ khả dụng khi mô-đun được bật, di.xmlnên được sử dụng. Nếu bạn không muốn thêm một mô-đun và chỉ muốn có một gói Trình soạn thảo tùy ý, bạn có thể sử dụng cli_commands.phpđể đăng ký lệnh ở đó. Tất nhiên, nó nên thực sự độc lập với Magento. Hoặc, hiện tại, cách tiếp cận này có thể được sử dụng để đăng ký (các) lệnh cần thiết ngay cả khi mô-đun bị vô hiệu hóa (đảm bảo rằng nó không dựa trên bất kỳ logic nào của Mô-đun chỉ hoạt động khi được bật).


11

Cách chính xác là:

Tạo mô-đun của bạn như bạn làm cho bất kỳ loại mô-đun

Chỉ cần tạo registration.phptập tin của bạn

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

Và tạo module.xmltập tin cho bạn :

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

Thêm một mục trong 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>

Tạo lớp lệnh của bạn:

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

Để chạy nhiệm vụ của bạn chỉ cần gõ:

php bin/magento my:command

Về khả năng tương thích:

@api không cần thiết cho các lệnh, nó được sử dụng cho các hợp đồng dịch vụ AFAIK.

Nếu bạn cần để chúng tương thích, chỉ cần sử dụng API giao diện bên trong tập lệnh của bạn thay vì đặt logic bên trong nó.

Ví dụ:

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

1
Thông tin hữu ích, +1, nhưng bạn có chắc chắn về điều đó? Các mô-đun dữ liệu mẫu của Magento sử dụng phương thức cli_commands.php và có vẻ sạch hơn và ít bị hỏng hơn nếu Magento thay đổi việc triển khaiMagento\Framework\Console\CommandList
Alan Storm

Tôi không chắc chắn 100%, chỉ Magento Itslef mới có thể trả lời câu hỏi này, nhưng tôi đã chơi một lúc trên nó và nếu bạn xóa "cli_commands.php", bạn vẫn sẽ thấy lệnh của mình có sẵn trong bin / magento của bạn. Họ cũng đã khai báo chúng trên di.xml, vì vậy tôi nghĩ rằng đó chỉ là một cái gì đó vẫn còn ở phiên bản beta. Giống như nó là cho các nhà xây dựng và nhà máy. Nếu bạn thấy, cli_command.php chỉ được sử dụng trong dữ liệu mẫu.
Phoenix128_RiccardoT

Điều gì khiến bạn nói rằng @api sẽ trở nên phản đối?
Kristof tại Fooman

@Kristof, rất xin lỗi tôi đã không hiểu chính xác một trong những slide giải pháp đối tác được đào tạo, vì vậy bỏ qua câu đó. Tôi đã sửa đổi bài viết của tôi loại bỏ nó.
Phoenix128_RiccardoT

3

nếu tôi hiểu đúng, các lệnh được xác định trong CommandList trên DI chỉ có sẵn trong Trường hợp Magento đã cài đặt và cũng chỉ dành cho Mô-đun Magento (vì chúng phải được xác định trong di.xml): https://github.com/magento /magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/iternal/Magento/Framework/Console/Cli.php#L124

Magento \ Framework \ App \ DeploymentConfig :: isAv Available () trong phương thức trên sẽ kiểm tra ngày cài đặt trong Cấu hình để kiểm tra Magento2 đã cài đặt: https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cfc nội bộ / Magento / Framework / Ứng dụng / DeploymentConfig.php # L83 ).

Các lệnh được định nghĩa trong Magento \ Framework \ Console \ CommandLocator mặt khác luôn có sẵn và thậm chí có thể được xác định bởi các Mô-đun không Magento thông qua phương thức tĩnh CommandLocator :: trong một tệp do trình soạn thảo tự động tải (ví dụ cli_commands.php)

https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/iternal/Magento/Framework/Console/Cli.php#L130

https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/iternal/Magento/Framework/Console/Cli.php#L146

Vì vậy, tôi nghĩ rằng cả hai phương pháp đều cần thiết và có quyền tồn tại


Đó là một quan sát tốt +1, nhưng tại sao bạn cần một tập lệnh Magento trong khi mô-đun liên quan chưa được cài đặt?
Phoenix128_RiccardoT

1
Nó về con ong magento không được cài đặt. Có một số lệnh có sẵn trước khi bạn cài đặt magento2. Ví dụ: lệnh samplingata: triển khai, có ý nghĩa nếu bạn muốn cài đặt trực tiếp dữ liệu mẫu với thiết lập magento2.
David Verholen

Tôi nghĩ bạn đúng. Vì vậy, cách "chính xác" cho mô-đun Magento là sử dụng di.xml (như trong câu trả lời của tôi) và sử dụng "cli_command.php" khi bạn cần chạy một số tác vụ trước khi mô-đun của bạn được cài đặt. Nó có ý nghĩa.
Phoenix128_RiccardoT

các bạn, tôi nghĩ rằng nó nên được nó. +1 vì tôi nghĩ rằng bạn có câu trả lời đúng (và được giải thích rất rõ), nhưng điều này không phù hợp với một nhận xét;)
David Verholen

Cảm ơn bạn @David Verholen, +1 của tôi có nghĩa là tôi đã cho bạn +1, không phải bạn xứng đáng chỉ là +1;)
Phoenix128_RiccardoT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.