Как переопределить базовый метод в yii2? Всем привет! Вопрос заключается в следующим. Есть базовый класс BaseYii в Yii2. В этом классе содержится метод t(). Сейчас я использую yii\i18n\DbMessageSource для переводов, которые хранятся в базе. Перевод можно получиться при помощи вызова метода t() с соответствующими аргументами. Задача заключается в том, чтобы дописывать в базу переводы, если их еще там нету, при вызове метода t(). Например, вызываем t('category', 'title'), оно само должно проверять есть ли перевод в базе и дописывать его, если его там нету. Как я могу это делать, если я хочу вызывать все тот же Yii::t() в своем приложении? Простите, если не совсем точно описал, это мой первый вопрос.
Для переопределения метода t() в Yii2 можно использовать наследование и создать свой собственный класс, который будет расширять класс yii\BaseYii. В этом новом классе можно переопределить метод t() и добавить необходимую логику для проверки и дополнения переводов в базе.
Пример кода:
namespace app\components; use Yii; class MyYii extends \yii\BaseYii { public static function t($category, $message, $params = [], $language = null) { // Проверяем, есть ли перевод в базе $translation = Yii::$app->db->createCommand('SELECT translation FROM translations WHERE category = :category AND message = :message') ->bindValue(':category', $category) ->bindValue(':message', $message) ->queryScalar(); if(!$translation){ // Если перевода нет, то дописываем его в базу Yii::$app->db->createCommand()->insert('translations', [ 'category' => $category, 'message' => $message, 'translation' => $message, // Здесь можно использовать любой метод для формирования перевода ])->execute(); } // Вызываем оригинальный метод t() для получения перевода return parent::t($category, $message, $params, $language); } }
Теперь в вашем приложении вместо вызова Yii::t() можно использовать MyYii::t(). Таким образом, при вызове метода t() будет происходить проверка наличия перевода в базе и его дополнение, если его нет.
Для переопределения метода t() в Yii2 можно использовать наследование и создать свой собственный класс, который будет расширять класс yii\BaseYii. В этом новом классе можно переопределить метод t() и добавить необходимую логику для проверки и дополнения переводов в базе.
Пример кода:
namespace app\components;use Yii;
class MyYii extends \yii\BaseYii
{
public static function t($category, $message, $params = [], $language = null)
{
// Проверяем, есть ли перевод в базе
$translation = Yii::$app->db->createCommand('SELECT translation FROM translations WHERE category = :category AND message = :message')
->bindValue(':category', $category)
->bindValue(':message', $message)
->queryScalar();
if(!$translation){
// Если перевода нет, то дописываем его в базу
Yii::$app->db->createCommand()->insert('translations', [
'category' => $category,
'message' => $message,
'translation' => $message, // Здесь можно использовать любой метод для формирования перевода
])->execute();
}
// Вызываем оригинальный метод t() для получения перевода
return parent::t($category, $message, $params, $language);
}
}
Теперь в вашем приложении вместо вызова Yii::t() можно использовать MyYii::t(). Таким образом, при вызове метода t() будет происходить проверка наличия перевода в базе и его дополнение, если его нет.