- Laravel background jobs
12345678910
WT форуми -> PHP MySQL ASP.NET -> Laravel background jobs
Създайте нова тема Напишете отговор 
Автор Съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 11/05/2018 10:24 am      Отговорете с цитат


Fakeheal написа:
teroristd написа:
Отказах се от vue и вместо това направих таймера с jquery. Сложих клик функция на бутона, сметнах времето и т.н. обаче изникна един проблем. Рут-а на бутона сочи към функцията в която викам queue-то, и за това на края на функцията завършвам с return redirect()->back(); за да се върна на главния рут. Обаче така прецаквам клик-а на jquery-то, то се стартира и спира защото след рефреша не е кликнато. Какво мога да направя?



Я обясни с код Smile


При клик се изпълнява рута на ъпдейта, а при redirect()->back() се връща на главния, което рефрешва страницата, и jquery таймера който е стартиран при клика, след рефреша изчезва.

Искам само да добавя че delay-а на Job-a няма нищо общо с jquery таймера, който ще го използвам просто да визуализира необходимото време за построяването на сградата.

И още нещо да добавя Very Happy, ако няма клик функция на jquery таймера той си се стартира веднага и рефреша не му пречи, но така не ми върши работа.

PHP code:

//Това е главния рут който връща вю-то.
Route::get('/home', 'HomeController@index')->name('home');

//Това е рута за ъпдейта на сградата
Route::get('/home/goldMineUpdate', [

'uses' => 'HomeController@goldMineUpdate',
'as' => 'gold.mine.update'

]);


Не съм дал целия код на метода защото той няма отношение към въпроса.
PHP code:

public function goldMineUpdate()
{
$job = (new CreateGoldMineJob($user_id))->delay(300);
dispatch($job);

Session::flash('success', 'The gold mine was updated successfuly');

return redirect()->back();
}


Това е блейда. Пак не съм дал целия код, но грубо часовника получава времето и при клик почва да тече.
PHP code:


@php
date_default_timezone_set('Europe/Sofia');
$date = date('Y-m-d H:i:s');
$currentDate = strtotime($date);
$futureDate = $currentDate + (60 * 5);
$formatDate = date("Y-m-d H:i:s", $futureDate);
@endphp


@if($mine->gold_mine == 0)
@php $time = $formatDate; @endphp
@endif

<a href="{{route('gold.mine.update')}}" id="target_one">
Update
</a>

<script>

var time = {!! json_encode($time) !!}

$("#target_one").click(function () {
$('#clock').countdown(time, function (event) {
var totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' ч. %M мин. %S сек.'));
});
});

</script>
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 11/05/2018 11:01 am      Отговорете с цитат


Всъщност като се замисля, по този начин както съм го направил няма да ми върши работа. Има ли начин да визуализирам delay-а на job-a?

PHP code:

$job = (new CreateGoldMineJob($user_id))->delay(300);
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 350
Bonus: 698
Мнения: 2649
Мнение 11/05/2018 11:12 am      Отговорете с цитат


1-во разкарай всичко в @php @endphp и го сложи в контролера. Чупиш дизайн патърн.
2-ро използвай ajax да диспатчнеш joba:

     $("#target_one").click(function (event) {
        event.preventDefault();
        //$.ajax() blah blah
       //в success() на ajax-a сложи countdown и покажи нотификацията, че е почнало (туй що подаваш в сешън->flash()
        $('#clock').countdown(time, function (event) {
            var totalHours = event.offset.totalDays * 24 + event.offset.hours;
            $(this).html(event.strftime(totalHours + ' ч. %M мин. %S сек.'));
        });

    });


PS: в респонса сложи времето, когато е почнало да брои за countdown-a.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 11/05/2018 11:47 am      Отговорете с цитат


Ajax-a по-принцип не ми е сила Very Happy . Така ли трябва да стане.


$("#target_one").click(function (event) {
            event.preventDefault();
            $.ajax({
               type:'GET',
               url:'/home/goldMineUpdate',
               success:function(){
                  var time = {!! json_encode($time) !!}
                  $('#clock').countdown(time, function (event) {
                   var totalHours = event.offset.totalDays * 24 + event.offset.hours;
                   $(this).html(event.strftime(totalHours + ' ч. %M мин. %S сек.'));
                  });
               }
            });
         }


Това за респонса не го разбрах. Също и това за флаш-а.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
deam0n
Tourist Defender

Регистриран на: 01/10/2005 6:33 pm

Support: 199
Bonus: 951
Мнения: 2975
Мнение 11/05/2018 12:04 pm      Отговорете с цитат


teroristd написа:
вади грешка.

PHP code:

<div id="app">
{{ message }}
</div>

<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>


Дава грешка, защото както знаеш в bladе темплейтите принтваш променливи с {{ $var }}, точно както във Vue.. За да не дава грешка трябва да се слага @ отпред.
примерно

<div id="app">
  @{{ message }}
</div>
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 11/05/2018 12:15 pm      Отговорете с цитат


Да това го открих, но имаше и други проблеми. Компонентите не работеха, включително и дефаултовия. Той се визуализираше но каквото и да променях по него нямаше ефект. В обикновен хтмл vue си работеше, но в ларавел имаше проблеми, така че се отказах да го ползвам.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 11/05/2018 12:22 pm      Отговорете с цитат


teroristd написа:
Ajax-a по-принцип не ми е сила Very Happy . Така ли трябва да стане.


$("#target_one").click(function (event) {
            event.preventDefault();
            $.ajax({
               type:'GET',
               url:'/home/goldMineUpdate',
               success:function(){
                  var time = {!! json_encode($time) !!}
                  $('#clock').countdown(time, function (event) {
                   var totalHours = event.offset.totalDays * 24 + event.offset.hours;
                   $(this).html(event.strftime(totalHours + ' ч. %M мин. %S сек.'));
                  });
               }
            });
         }


Това за респонса не го разбрах. Също и това за флаш-а.


От success трябва да взимаш отговора, който да обработиш. Това в твоя случай трябва да е времето нужно за сградата. И разбира се, трябва да го пратиш в JSON формат.

Поправка за напред: Блейд поддържа @json() директива. Не е нужно да ползваш начин, по който ти си го написал.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 350
Bonus: 698
Мнения: 2649
Мнение 11/05/2018 12:40 pm      Отговорете с цитат


Revelation написа:

Поправка за напред: Блейд поддържа @json() директива.


Laravel background jobs
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 11/05/2018 12:51 pm      Отговорете с цитат


Само че и с аякс проблема си остава. При рефреш таймера изчезва.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 11/05/2018 12:53 pm      Отговорете с цитат


Revelation написа:
teroristd написа:
Вече закъсах Very Happy. За да подкарам vue трябва ли да инсталирам нещо? Като цяло идеята ми е да вържа dispatch()->delay() с брояч за да се вижда колко време остава до построяването на сградата. Това дали може да стане с vue или да търся друго решение?


...

Навръзването може да е много лесно, може да е и много сложно. Така или иначе трябва да записваш някъде постоянно или в определен event изминалото време. Естествено, не е добра идея да е в базата данни.

В момента за такива неща е най-готино да се ползва Redis или някоя друга NoSQL база данни.

А връзката с Vue може да е през broadcasting-а на Laravel или AJAX заявки.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 11/05/2018 1:07 pm      Отговорете с цитат


Добре аз си свалих някакъв redis сървър за windows, и в момента го ползвам като драйвер за queue-тата. Ако можеш да ми покажеш как се прави подобно нещо?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 11/05/2018 3:37 pm      Отговорете с цитат


О, не. Доста по-рано в темата ти бях казал, че нямам време да седна да правя тестове, за да ти предоставя код.
Гледам само да те насочвам и максимално да ти помогна теоритично.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
12345678910
Страница 8 от 10


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети