Иногда возникает ошибка неверного типа в консоли Symfony 2

У меня есть среда Symfony 2, в которой я использую пользовательский тип данных с сопоставлениями ODM Doctrine MongoDB. Все это работает, за исключением случаев; когда я иду, чтобы очистить кеш или установить активы, я иногда получаю следующую ошибку:

[InvalidArgumentException]
Invalid type specified "..."

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

Тип добавляется как часть метода boot() в другой пакет, который не всегда может быть включен.

  • Что здесь происходит?
  • Могу ли я как-то гарантировать, что тип загружается раньше, или предоставить его в файле конфигурации? Насколько я могу судить, в настоящее время нет способа использовать конфигурацию MongoDB для указания пользовательских типов в файле .yml, как описано для ORM здесь.

person Sean Quinn    schedule 09.01.2013    source источник


Ответы (2)


Я нашел хорошее решение в этом посте.

Короткий ответ - добавить

\Doctrine\ODM\MongoDB\Mapping\Types\Type::registeredType('mytype', 'My\Type\Class');

в MyBundleClass::__consruct(). Это позволит зарегистрировать тип до того, как произойдет прогрев кеша.

Использование Type::registeredType() вместо Type::addType() позволит избежать проверки того, зарегистрирован ли уже тип. В случае Type::addType() будет выброшено исключение, если оно уже было добавлено.

person Shank    schedule 16.03.2013

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

В app/autoload.php после регистрации реестра аннотаций и драйвера я вызываю:

\Doctrine\ODM\MongoDB\Mapping\Types\Type::addType('mytype', 'My\Type\Class');

... и это, по-видимому, гарантирует, что тип будет зарегистрирован при вызове консольных команд.

person Sean Quinn    schedule 09.01.2013
comment
Пометка как ответ на данный момент, пока кто-то не предложит лучшее решение, которое они могут предложить. - person Sean Quinn; 08.02.2013