Вызов статического метода модели из консольного контроллера

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
long399
Сообщения: 19
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Вызов статического метода модели из консольного контроллера

Сообщение long399 » 2020.01.10, 07:30

Здравствуйте, Коллеги!

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

Код: Выделить всё

public static function clearDepartmentsStructureCache()
    {
        $res = true;
        $models = self::getModelsDepartments(); // получаем все модели департаментов
        
        foreach($models as $model){ // пробегаемся по всем департаментам
            if (Yii::$app->cache->exists('DepartmentStructure' . $model->id)) // удаляем кэш структуры департамента если он (кэш) имеется
                $res = $res && Yii::$app->cache->delete('DepartmentStructure' . $model->id);
        }
        return $res;
    }
Данный метод работает, если его вызывать из вьюшки, к примеру сначала запустить очистку кэша, а затем получение новой структуры и ее кэширование.
Это заметно по времени загрузки страницы, структура большая и когда мы ее формируем заново приходится ждать некоторое время. Т.е. кэш точно очищается.

Код: Выделить всё

DictionaryDepartments::clearDepartmentsStructureCache(); // очитска кэша структур департаментов
echo getCachedStructure($dept, 0); // получаем структуру департамента из кэша или формируем заново (и кэшируем)
Я попытался перенести вызов этого метода в консольный контроллер, который содержит некоторые скрипты для работы именно с департаментами. Указываю модель для которой вызываю статический метод через use. Вызываю там данный статический метод модели. Отрабатывает, ошибок нет, но кэш не сбрасывается на самом деле. Ибо загрузка страницы со структурой (после отработки action-а консольного контроллера) происходит мгновенно (берется из кэша, который не очистился).

Код: Выделить всё

use common\models\dictionaries\DictionaryDepartments;

class DepartmentsController extends Controller
{

public function actionClearStructureCache()
    {
        DictionaryDepartments::clearDepartmentsStructureCache(); // очитска кэша структур департаментов
    }

}
В чем может быть дело, подскажите пожалуйста?

Аватара пользователя
maleks
Сообщения: 1845
Зарегистрирован: 2012.12.26, 12:56

Re: Вызов статического метода модели из консольного контроллера

Сообщение maleks » 2020.01.10, 08:21

смотрите как настроен компонент cache в консольном приложении
Yii2 universal module sceleton - for basic and advanced templates

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

Re: Вызов статического метода модели из консольного контроллера

Сообщение yiiliveext » 2020.01.10, 09:42

По умолчанию компонент кеш имеет файловый тип и указывает на директорию runtime/cache текущего приложения. То есть, в консольном приложении вы через Yii::$app->cache->exists() и Yii::$app->cache->delete() работаете с кешем, который находится в console/runtime/cache. Выход - продублируйте компоненты кеша для фронтенда и бекенда в конфиге консольного приложения прямо указав нужные директории.

Код: Выделить всё

        'frontendCache' => [
            'class' => 'yii\caching\FileCache',
            'cachePath' => '@frontend/runtime/cache',
        ],
        'backendCache' => [
            'class' => 'yii\caching\FileCache',
            'cachePath' => '@backend/runtime/cache',
        ],
Теперь в консольном конроллере кеш фронтенда и бекенда будет доступен соответственно через Yii::$app->frontendCache и Yii::$app->backendCache. Также полную очистку кеша для всех приложений теперь можно будет сделать выполнив в консоли ./yii cache/flush-all

long399
Сообщения: 19
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Вызов статического метода модели из консольного контроллера

Сообщение long399 » 2020.01.13, 05:22

Спасибо большое, советы помогли! Разобрался с конфигом, теперь все заработало :roll:

Ответить