Обработка переводимых объектов с переводом, хранящимся в одной строке, с помощью Doctrine

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

id | name | name_de | name_fr
1 | cat  | Katze   | chat
2 | dog  | Hund    | chien

Моя сущность отображается в соответствии с:

class Animal
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*
* @var integer
*/
private $id;

/**
* @ORM\Column(name="name", type="string", length=64, nullable=false)
*
* @var string
*/
private $name;

/**
* @ORM\Column(name="name_de", type="string", length=64, nullable=false)
*
* @var string
*/
private $nameDe;

/**
* @ORM\Column(name="name_fr", type="string", length=64, nullable=false)
*
* @var string
*/
private $nameFr;

/* Followed by getters and setters */
}

Я уже смотрю в переводимый расширение, но это не может соответствовать моей схеме базы данных. Я также начал с пользовательской аннотации, подключаемой к postLoad событие, но потом меня остановил простой вопрос, который postLoad может быть запущен в прокси-состоянии объекта.

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

ура
Матиас

1

Решение

Здесь есть довольно много решений, и я думаю, что я не посмотрел половину из них.

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

class Translation
{

/**
* @var string
*/
private static $language;

/**
* tries to get a translated property by prepending the
* configured language to the given entities getter
*
* @param object $entity
* @param string $getter
* @return mixed
*/
public static function getTranslated($entity, $getter) {
$language = self::getLanguage();
$translatedGetter = $getter.$language;
if(method_exists($entity, $translatedGetter)) {
return $entity->$translatedGetter();
} else {
return $entity->$getter;
}
}

/**
* @return string
*/
public static function getLanguage()
{
return self::$language;
}

/**
* @param string $language
*/
public static function setLanguage($language)
{
self::$language = ucfirst(strtolower($language));
}

}

Затем вы устанавливаете язык каждый раз, когда запускается ваше приложение, и реализуете переводы либо в ваших сущностях:

/**
* @return string
*/
public function getName()
{
return Translation::getTranslated($this, __FUNCTION__);
}

или позвоните извне:

Translation::getTranslated($animal, "getName");

Итак, с первым методом этот код:

Translation::setLanguage("DE");

// far more code

/** @var Animal[] $animals */
$animals = $entityManager->getRepository(Animal::class)->findAll();

foreach ($animals as $animal) {
echo $animal->getName()."<br >";
}

выложил бы:

Katze
Hund

Конечно, это всего лишь один из способов сделать это со статическим классом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]