Я пытаюсь запустить команды обработчик данных из нескольких контекстов (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 Как сказал ОП, вызов команд из контроллера Symfony ему не подходит. Вот почему я предложил использовать Process
, почему вы нашли это решение не достойным?
@HarviDent Если вы имели в виду отрицательное мнение, это было не мое. Но в любом случае я не думаю о решении, потому что: оно предлагалось в другом месте много раз, в любом случае это плохой подход, поскольку извлечение функциональности в другой сервис было бы более разумным, и, что более важно, потому что без понимания Зачем другой подход не работает, просто давать советы вслепую (что, как я только что упомянул, является не только советом плохой, но и повторяющимся советом).
Эй, большое спасибо за ответы! @yivi ., под «классом» я имел в виду, например. класс контроллера Extbase. Под извлечением его функциональности вы подразумеваете использование этой основной библиотеки: docs.typo3.org/m/typo3/reference-coreapi/10.4/en-us/ApiOverview/…?
И что происходит, когда вы пытаетесь использовать подход, описанный в документации, в вашем классе Extbase Controller? Вы получаете ошибку? Почему это не работает?
@yivi Дело в том, что я не знаю, как вызвать консольную команду Synfony из класса Extbase Controller. Примеры, которые я нашел в Интернете, например этот: symfony.com/doc/current/console/command_in_controller.html Используйте метод с этим параметром KernelInterface для его вызова, который я не знаю, как реализовать для класса контроллера Extbase.
Вы пытались внедрить KernelInterface
в свои контроллеры? Это все еще приложение Symfony.
Большое спасибо, ребята, но в конце концов я выбрал подход @HarviDent, и все прошло успешно.
Вы можете использовать The Process Component
для запуска команд в вашем классе.
composer require symfony/process
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
. Работает как шарм!
Что вы подразумеваете под "классом"? Какой класс? Где будет выполняться этот вызов? Показанный пример здесь будет работать практически везде. Где вы пробовали этот подход и как он потерпел неудачу?