Laravel background jobs

С въображение, хаха.

Пиша от телефона за това ще съм кратък.

Не е нужно да ги попълваш при регистрация. Просто там където ще строиш правиш проверка, ако нямаш записи в тази таблица, означава че всички сгради са ти на 0. Вече като започнеш да строиш си я попълваш за всяка една нова сграда. Оттам нататък ъпдейтваш нивото на сградата, ако съществува вече запис.

Това е лесно с Ларавел като използваш updateOrCreate() метода.
 
Разделяй таблиците според предназначението им. Например таблицата юзърс трябва да съдържа само данни, отнасящи се за юзърите, таблицата билдингс трябва да съдържа само данни за сградите. Ако започнеш да смесваш данноте, не отива на добре. По-добре направи трета таблица с имотите на юзъра - какви сгради си е купил, кое ниво са и т.н.
 
pix3l каза:
Разделяй таблиците според предназначението им. Например таблицата юзърс трябва да съдържа само данни, отнасящи се за юзърите, таблицата билдингс трябва да съдържа само данни за сградите. Ако започнеш да смесваш данноте, не отива на добре. По-добре направи трета таблица с имотите на юзъра - какви сгради си е купил, кое ниво са и т.н.

Точно това се опитвам да направя, само дето не ми се получава :D .
 
Направи го както си знаеш, после като се наложи refactoring ще разбереш къде си сбъркал... даже още по-добре, така придобиваш опит. :D

Даже, ако не ти е проблем, ползвай ORM. Ти се грижиш за обектите и връзката между тях, а ORM-а се грижи за базата с данни, ключове и т.н.
 
teroristd каза:
pix3l каза:
Разделяй таблиците според предназначението им. Например таблицата юзърс трябва да съдържа само данни, отнасящи се за юзърите, таблицата билдингс трябва да съдържа само данни за сградите. Ако започнеш да смесваш данноте, не отива на добре. По-добре направи трета таблица с имотите на юзъра - какви сгради си е купил, кое ниво са и т.н.

Точно това се опитвам да направя, само дето не ми се получава :D .

Свикнеш ли.. или по-скоро схванеш ли идеята, ще видиш, че е много по-лесно да си разделиш таблиците и ще е много по-лесно да се работи с тях.
Но само да добавя, че не винаги Eloquent е най-добрия избор. Понякога ще те обърква само и ще се чудиш с часове как да извъртиш нещата, за да го накараш да работи, както искаш и особено, ако искаш да си спестиш броя на заявките.

П.П. Добави си https://github.com/barryvdh/laravel-debugbar този плъгин към ларавел, за да можеш да следиш по-лесно кое кога се рендира, какви заявки точно се изпълняват, какви логове вървят(това в повечето случаи ти трябва да на теб да дебъгваш своя код), какви грешки има и т .н. Абе доста е полезен при разработка.
 
Имам един проблем с queue-то. Ако хардкодна данните както съм показал по-долу си работи.

PHP:
public function handle()
    {
            MinesLevels::where('user_id', 1)
                ->update(['gold_mine' => 1]);
    }

Обаче ако например вместо 1 за user_id си викам класа не иска да работи. Изобщо в заявките ако стойностите не са хардкоднати не бачка. Къде може да е проблема?

PHP:
public function handle()
    {
            MinesLevels::where('user_id', Auth::user()->id)
                ->update(['gold_mine' => 1]);
    }
 
(Командата) Job-a (поправка) не може да използва auth, така че трябва да си подадеш на самата команда ID-то на логнатия юзър.

Представи си че работят успоредно, а не съвместно с уеб приложението.


Код:
class UpdateMineLevels extends Job implements ShouldQueue
{
    private $user_id;

    public function __construct($user_id)
    {
        $this->user_id = $user_id;
    }

    public function handle()
    {
        MinesLevels::where('user_id', $this->user_id)
            ->update(['gold_mine' => 1]);
    }

}

//И после
// Предполагам ползваш trait-a ShouldQueue
//$this->dispatch(new UpdateMineLevels(Auth::user()->id));
 
teroristd каза:
Ясно, а това само за Auth ли важи или за всички класове зад фасада?

Малко те обърках с изречението по-горе, за което се извинявам.

Проблема не е във фасадата, а в сесията. Тъй като този job се изпълнява от cli(?) няма сесия сетната. Затова и няма логнат юзър и Auth::user() е празно.
 
Много назад в темата ти бях показал как да подаваш данните чрез dispatch().
 
Явно съм го пропуснал :), сега вече разбрах. До тука е ок, сега ще се опитам да сложа брояч с vue.js но ще пиша малко по-натам като закъсам.
 
Вече закъсах :D. За да подкарам vue трябва ли да инсталирам нещо? Като цяло идеята ми е да вържа dispatch()->delay() с брояч за да се вижда колко време остава до построяването на сградата. Това дали може да стане с vue или да търся друго решение?
 
teroristd каза:
Вече закъсах :D. За да подкарам vue трябва ли да инсталирам нещо? Като цяло идеята ми е да вържа dispatch()->delay() с брояч за да се вижда колко време остава до построяването на сградата. Това дали може да стане с vue или да търся друго решение?

Дефинирай въпроса за да подкарам:D

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

Въпроса е, наясно ли си какво е Vue :D Vue си е просто библиотека, можеш да си я добавиш самостоятелно.

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

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

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

Дефинирай въпроса за да подкарам:D

https://vuejs.org/v2/guide/

Еми гледам някакви туториали, там използват компоненти и т.н. но при мен нищо не се визуализира :D. Дори този пример от линка който си дал ми вади грешка.

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

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

Горе