Переводимые доктрины

У меня есть рабочий объект с полем (типа ArrayCollection), который сопоставляется с доктриной в столбце типа массив.

Теперь мне нужно, чтобы это поле было переводимым (доктринальное поведение), но я получаю Не удалось преобразовать значение базы данных «» в массив типа Doctrine ConversionException при получении нетранслируемой локали.

Как я могу сохранить функциональность массива и сделать его переводимым?

Декларация о собственности в пределах объекта Product:

/**
* @var ArrayCollection
*
* @Gedmo\Translatable
* @ORM\Column(name="categories", type="array")
*/
private $categories;

Действие контроллера:

// ... Controller ProductController nitty gritty

public function showAction(Request $request, $id, $locale)
{
// omitted stuff, load $product by $id

$product->setTranslatableLocale($locale); // load translations
$em->refresh($product);

return $this->render('AcmeExampleBundle:Product:show.html.twig', [
'product' => $product
]);
}

Исключение:

ConversionException

Не удалось преобразовать значение базы данных «» в массив типа Doctrine

Трассировка стека исключений: Pastebin

2

Решение

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

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

UPDATE `product` SET categories="a:0:{}" WHERE categories= "";

Надеюсь, это может помочь.

1

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

Я был неправ. Я пытался установить свой собственный {locale} сегмент маршрута, когда я должен был использовать родной {_locale} (обратите внимание на подчеркивание — документация).

Если вы позволите Symfony обрабатывать локали через маршрутизацию, переводимый будет прозрачно обрабатывать переводы сущностей (включая отправку форм), и нет необходимости в вызове $entity::setTranslatableLocale() ни EntityManager::refresh(),

Нет необходимости в специальной обработке для массивов полей, они легко переводятся из коробки.

0

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