Как мне установить язык для репозиториев Extbase в CLI TYPO3/Symfony?

Я регулярно разрабатываю команды импорта/экспорта, работающие с несколькими языками. Я всегда использую репозитории и модели Extbase, поэтому мне не приходится соединять записи вручную или делать другие схематичные вещи.

У меня есть обходные пути: установите для setRespectSysLanguage значение false и добавляйте sysLanguageUid вручную в каждый запрос, но у меня должны быть свои собственные методы, которые возвращают запись на нужном мне языке.

Нет ли в TYPO3 способа установить определенный язык в команде Symfony, возможно, через языковой аспект, глобально, чтобы мне не нужно было иметь специализированные методы для всего, и я мог переключиться на другой язык, отличный от язык по умолчанию и получать записи из репозитория на этом языке?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете реализовать следующий метод в своем классе репозитория:

public function setLanguage($langId)
{
    $querySettings = $this->createQuery()->getQuerySettings();
    $querySettings->setLanguageUid($langId);
    $this->setDefaultQuerySettings($querySettings);
}

И теперь вы можете установить идентификатор языка в своем репозитории перед получением данных. Т.е. так:

// LangId 2 i.e.
$langIdYouWant = 2;
$this->yourRepository->setLanguage($langIdYouWant);
$model = $this->yourRepository->findByAnythingYouWant('WhatYouWant');

Имейте в виду, что метод findByUid будет игнорировать установленный идентификатор языка.

Теперь вы можете передать идентификатор языка в команду cli и изменить язык в репозитории, прежде чем что-то делать.

РЕДАКТИРОВАТЬ после первого комментария

Если вам нужно немного больше автоматизации, вы можете сделать следующее. Реализуйте базовый класс для своих репозиториев, который будет реализован всеми вашими репозиториями следующим образом:

class YourRepository extends YourBaseRepository
{
    // Do fancy repo stuff here....
}

В базовом репозитории вы можете реализовать метод инициализацииОбъекта следующим образом:

class YourBaseRepository extends Repository
{
    
    public function initializeObject() {
        parent::initializeObject();
        if (defined('CLI_IMPORT_LANGUAGE_UID')){
            $langId = constant('CLI_IMPORT_LANGUAGE_UID');
            $querySettings = $this->createQuery()->getQuerySettings();
            $querySettings->setLanguageUid($langId);
            $this->setDefaultQuerySettings($querySettings);
        }
    }

}

Итак, теперь вы можете передать идентификатор языка вашему CommandController при его выполнении. И установите идентификатор языка как константу времени выполнения.

define('CLI_IMPORT_LANGUAGE_UID', $langUid);

Таким образом, константа доступна только для процедуры импорта вашей команды. Это должно сработать.

Спасибо. Я обычно так делаю. Проблема с этим методом в том, что как только он становится более сложным, вам придется применять его ко всем репозиториям, и все репозитории должны иметь правильный язык в любое время, поэтому вероятность ошибки возрастает. Это подходит для простых задач, но для сложного импорта с множеством разных репозиториев вам необходимо убедиться, что во всех ваших репозиториях используется правильный язык. Я просто подумал, может быть, есть более простой способ, предоставляемый ядром, который я пропустил.

Pnoreck 23.04.2024 17:17

Используйте DataHandler/QueryBuilder для импорта в CLI, а не в Extbase. Extbase — это контекст FE, CLI — это контекст BE, но не контекст веб-запроса. Вы можете «имитировать контекст FE» вместе со всем, что необходимо для загрузки контекста FE, включая запрос (глобальный), загрузку TypoScript (Extbase активно использует TypoScript, потому что он привязан к контексту FE) и т. д. Вы не найдете ничего из ядра, которое могло бы помочь. вы находитесь в контексте CLI с Extbase, поскольку Extbase не предназначена для работы в этой области.

Stefan Bürk 23.04.2024 22:55

Да, но с DataHandler/QueryBuilder я не могу использовать существующие модели. Это требует, чтобы я сам обрабатывал все соединения между таблицами, что требует гораздо больше работы и времени, чем использование репозиториев.

Pnoreck 24.04.2024 00:33

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