Laravel background jobs

Пренатоварен ми се струваш, щом започна с такива въпроси. :D

https://vuejs.org/v2/guide/#Getting-Started

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


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


Я обясни с код :)

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

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

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

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

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

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

]);

Не съм дал целия код на метода защото той няма отношение към въпроса.
PHP:
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:
@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>
 
Всъщност като се замисля, по този начин както съм го направил няма да ми върши работа. Има ли начин да визуализирам delay-а на job-a?

PHP:
$job = (new CreateGoldMineJob($user_id))->delay(300);
 
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.
 
Ajax-a по-принцип не ми е сила :D . Така ли трябва да стане.

Код:
$("#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 сек.'));
                  });
               }
            });
         }

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

PHP:
<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>
 
Да това го открих, но имаше и други проблеми. Компонентите не работеха, включително и дефаултовия. Той се визуализираше но каквото и да променях по него нямаше ефект. В обикновен хтмл vue си работеше, но в ларавел имаше проблеми, така че се отказах да го ползвам.
 
teroristd каза:
Ajax-a по-принцип не ми е сила :D . Така ли трябва да стане.

Код:
$("#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() директива. Не е нужно да ползваш начин, по който ти си го написал.
 
Revelation каза:
Поправка за напред: Блейд поддържа @json() директива.

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

...

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

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

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


Я обясни с код :)

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

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

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

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

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

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

]);

Не съм дал целия код на метода защото той няма отношение към въпроса.
PHP:
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:
@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>
Не съм чел цялата тема, постът ми е насочен конкретно към тоя ти пост...

Какво ти пречи при зареждането на страницата да проверяваш дали се строи сграда и да пускаш таймера ако има такава. Ако няма нищо за строене, закачаш клик евента и готово.

Аз поне така ти разбрах проблема.
 
pix3l каза:
Не съм чел цялата тема, постът ми е насочен конкретно към тоя ти пост...

Какво ти пречи при зареждането на страницата да проверяваш дали се строи сграда и да пускаш таймера ако има такава. Ако няма нищо за строене, закачаш клик евента и готово.

Аз поне така ти разбрах проблема.

Така както си предложил от един стават два проблемите :). Първо не виждам как ще взема оставащото време от delay() ако се строи сграда за да пусна таймер. Второ както съм писал по горе клик евента изчезва при рефреш.
 
Revelation каза:
Навръзването може да е много лесно, може да е и много сложно. Така или иначе трябва да записваш някъде постоянно или в определен event изминалото време. Естествено, не е добра идея да е в базата данни.

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

Въпроса е как да взема времето за да мога да го запиша?
 

Горе