TYPO3: Как вызвать консольную команду из класса PHP?

Я пытаюсь запустить команды обработчик данных из нескольких контекстов (Frontend, Backend и т. д.). Из того, что я читал и пробовал, это должно быть сделано в Команда Synfony, чтобы оно работало правильно. Только после этого внутри команды можно запускать такие фрагменты кода:

Bootstrap::initializeBackendAuthentication();
$data = [...]
$dataHandler = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\DataHandling\DataHandler::class);
$dataHandler->start($data, []);
$dataHandler->process_datamap();

И это _cli_ внутренний пользователь, который запускает эти команды DataHandler.

Я создал свою команду Synfony в соответствии с документами. Он зарегистрирован, и я могу назвать его так, и он работает так, как ожидалось:

$ vendor/bin/typo3 myext:rundatahandler

Мой вопрос: как я могу запустить это в классе PHP? Я не могу найти его ни в документах, ни в Интернете. Я нахожу это только для классов Synfony Controller, которые ведут себя по-другому и имеют другие входы и атрибуты, чем у TYPO3.

Заранее большое спасибо!

Что вы подразумеваете под "классом"? Какой класс? Где будет выполняться этот вызов? Показанный пример здесь будет работать практически везде. Где вы пробовали этот подход и как он потерпел неудачу?

yivi 05.04.2022 07:33

Кроме того, чаще всего, если вы обнаружите, что хотите выполнить команду из разных контекстов, вы должны извлечь ее функциональность в службу, которую затем вы можете вызывать либо из консольной команды, либо из любого места, где вам это нужно.

yivi 05.04.2022 07:37

@yivi Как сказал ОП, вызов команд из контроллера Symfony ему не подходит. Вот почему я предложил использовать Process, почему вы нашли это решение не достойным?

Harvi Dent 05.04.2022 07:52

@HarviDent Если вы имели в виду отрицательное мнение, это было не мое. Но в любом случае я не думаю о решении, потому что: оно предлагалось в другом месте много раз, в любом случае это плохой подход, поскольку извлечение функциональности в другой сервис было бы более разумным, и, что более важно, потому что без понимания Зачем другой подход не работает, просто давать советы вслепую (что, как я только что упомянул, является не только советом плохой, но и повторяющимся советом).

yivi 05.04.2022 07:54

Эй, большое спасибо за ответы! @yivi ., под «классом» я имел в виду, например. класс контроллера Extbase. Под извлечением его функциональности вы подразумеваете использование этой основной библиотеки: docs.typo3.org/m/typo3/reference-coreapi/10.4/en-us/ApiOverv‌​iew/…?

DidacC 05.04.2022 10:03

И что происходит, когда вы пытаетесь использовать подход, описанный в документации, в вашем классе Extbase Controller? Вы получаете ошибку? Почему это не работает?

yivi 05.04.2022 10:12

@yivi Дело в том, что я не знаю, как вызвать консольную команду Synfony из класса Extbase Controller. Примеры, которые я нашел в Интернете, например этот: symfony.com/doc/current/console/command_in_controller.html Используйте метод с этим параметром KernelInterface для его вызова, который я не знаю, как реализовать для класса контроллера Extbase.

DidacC 05.04.2022 10:36

Вы пытались внедрить KernelInterface в свои контроллеры? Это все еще приложение Symfony.

yivi 05.04.2022 10:38

Большое спасибо, ребята, но в конце концов я выбрал подход @HarviDent, и все прошло успешно.

DidacC 06.04.2022 00:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
9
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать The Process Component для запуска команд в вашем классе.

Установка

composer require symfony/process

Используйте в своем классе PHP

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

class YouClass{

    public function someAction(){
        $process = new Process(['vendor/bin/typo3', 'myext:rundatahandler']);
        // set the working directory to the root of the project
        $process->setWorkingDirectory(getcwd() . "/../");
        $process->run();
    }
}

Примечание: Кроме того, если у вашего класса нет доступа к папке поставщика, вы должны потребовать файл vendor/autoload.php

require 'vendor/autoload.php';

Спасибо за ответ! В конце концов я последовал вашему подходу и создал класс Symfony Command, который принимает массивы $cmd и/или $data в виде строк JSON и после успешного выполнения вызова DataHandler возвращает $copyMappingArray_merged также в виде строки JSON, чтобы иметь возможность получить UID. скопированных записей. Затем я создал статический служебный метод, которому вы передаете массивы $cmd и/или $data, который сериализует их и синхронно вызывает команду Symfony. Он также извлекает и десериализует $copyMappingArray_merged. Работает как шарм!

DidacC 06.04.2022 00:08

Другие вопросы по теме