@Holyboom
junior fullstack

Как изменить поля в модели через n-времени в Yii2?

Суть в чем , есть модель с полями: дата создания , дата завершения и статус .
дата создания заполняется при создании , а дата завершения должна заполниться при изменении статуса или через 2 часа после создания и затем поменять статус .

если с изменением статуса все понятно , то как отследить что 2 часа прошло и заполнить эти поля ?

есть вариант в афтерфайнд проверять даты , и менять их при необходимости , но как потом исключить измененное из выдачи?

public function afterFind()
    {
        parent::afterFind();

        if ($this->creation_at + 7200 < time() && $this->status != 1 ){
                $this->ended_at = $this->creation_at + 7200 ;
                $this->status = 1 ;
                $this->save(false);
        }
    }
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
@Holyboom Автор вопроса
junior fullstack
короч как сделал .
поставил плагин для yii "composer require --prefer-dist yiisoft/yii2-queue"
в common/config/main добавил
'components' => [
        'queue' => [
            'class' => \yii\queue\file\Queue::class,
            'path' => '@console/runtime/queue',
            'as log' => \yii\queue\LogBehavior::class,
        ],
'bootstrap' => [
        'queue',
    ],


создал класс отвечающий за таски
<?php
class QueueHelper
{
    public static function setTask ($task) {
        Yii::$app->queue->push($task);
    }
    public static function setDelayTask ($task , $delay = 5) {  // delay  - задержка выполнения в сек
        Yii::$app->queue->delay($delay)->push($task);
    }
}


и класс с самой таской
class TaskEndEvent extends BaseObject implements \yii\queue\JobInterface
{
    public $idTask;
    public function execute($queue)
    {
        $e = Events::findOne($this->idTask);
        if ($e->status != 1 ){
            $e->ended_at = $e->creation_at + 7200 ;
            $e->status = 1 ;
            $e->save(false);
        }
    }
}


и сделал вызов при сохранении
public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);
        if ($this->status != 1){
            QueueHelper::setDelayTask(new TaskEndEvent(['idTask'=>$this->id]), 7200);
        }
    }


и кроном запустил проверку на наличие актуальных таск
cron run * * * * * /usr/bin/php /var/www/my_project/yii queue/run


можно повесить слушатель таск в консоли
yii queue/listen
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы