Причина этого странного поведения Symfony заключается в том, что когда вы загружаете приборы через cli, контекст не загружается (например, когда вы пытаетесь получить экземпляр контекста sfContext::getInstance()
, вы получите ошибку «экземпляр контекста не существует»).исключение).
При отсутствии доступного экземпляра контекста отсутствует «текущая культура», а при отсутствии текущей культуры нет значения полей i18n.
Symfonyконтекст фактически поддерживает все функциональные возможности I18N с текущей культурой пользователя ($currentUserCulture = sfContext::getInstance()->getUser->getCulture()
).
Это все означает 2 вещи:
- Вы не можете использовать symfony "текущий пользователькультурные возможности, пока вы находитесь в сеансе cli
- Если вам нужно иметь
sfContext::getInstance()
где-то в вашем коде (особенно в моделях), вы должны закрыть его в состояние, чтобы избежать любых неприятностей с неожиданными и трудными длянайти исключения, находясь в cli
Пример получения текущей культуры в классе модели (условие не будет проходить в условиях cli):
if (sfContext::hasInstance()) {
sfContext::getInstance()->getUser()->getCulture();
}
Поэтому, когда вы не можете использовать ярлыки Symfony i18n (например, $record->getName()
), вы должны обойти это.В ваших моделях symfony1-doctrine у вас всегда есть объект $this->Translation
.Таким образом, вы можете получить доступ к своему объекту значений перевода через что-то вроде $this->Translation[$culture]
.
Вы можете работать с этим, вы можете использовать свою культуру по умолчанию $this->Translation[sfConfig::get('sf_default_culture')]
или взаимодействовать через все поддерживаемые культуры из некоторого глобальногоконфигурация (я рекомендую вам установить его в одном из ваших файлов конфигурации глобально для всех приложений - возможно, /config/app.yml).
Пример получения $ record объекта перевода в любых ситуациях:
if (sfContext::hasInstance()) {
$translation = $this->Translation[sfContext::getInstance()->getUser()->getCulture()];
}
else {
$translation = $this->Translation->getFirst();
// or: $translation = $this->Translation[$yourPreferedCulture];
}
// you can access to modified fields of translation object
$translationModified = $translation->getModified();