Nakon ovog poglavlja
Što ćete znati napraviti
- Ubrizgati ovisnost kroz konstruktor i vezati interfejs za implementaciju.
- Premjestiti spor posao u queue i učiniti ga ponovljivim.
- Uvesti cache i scheduler bez skrivene zastarjelosti ili preklapanja.
Sastavljanje objekata
Ovisnosti ulaze kroz konstruktor
Laravelov container automatski razrješava konkretne klase, a interfejs vežemo za implementaciju u service provideru. Klasa tada ovisi o ugovoru, ne globalnom facade pozivu, što olakšava testiranje i zamjenu infrastrukture.
<?php
final class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->bind(
ArticleRepository::class,
EloquentArticleRepository::class,
);
}
}
Spor rad nakon odgovora
Job mora podnijeti ponavljanje
Slanje e-maila, obrada slike i sinkronizacija sa stranim servisom ne trebaju blokirati HTTP odgovor. Job šaljemo u queue, a worker ga izvršava s retry pravilima. Budući da se job može pokrenuti više puta, dizajniramo ga idempotentno i postavljamo timeout.
Događaj govori da se nešto dogodilo, a listener reagira. Ne skrivajte ključni poslovni tok iza niza teško vidljivih listenera; transakcijsko spremanje mora biti jasno.
<?php
final class GenerateArticlePreview implements ShouldQueue
{
use Queueable;
public int $tries = 3;
public int $timeout = 60;
public function __construct(public readonly int $articleId) {}
public function handle(PreviewGenerator $generator): void
{
$generator->generateIfMissing($this->articleId);
}
}
Brzina uz pravilo svježine
Cache mora imati vlasnika i način invalidacije
Cache koristimo za skup izračun ili često čitan podatak. Ključ uključuje sve što utječe na rezultat, TTL ograničava zastarjelost, a promjena podataka briše ili verzionira cache. Cache nije primarna baza.
Scheduler definira periodične naredbe u kodu, dok server svake minute pokreće schedule:run. withoutOverlapping i onOneServer sprječavaju duplikate gdje zadatak to zahtijeva.
<?php
$articles = Cache::remember(
'homepage:published:v1',
now()->addMinutes(10),
fn () => Article::published()->latest()->limit(10)->get(),
);
Schedule::command('articles:expire')
->everyMinute()
->withoutOverlapping()
->onOneServer();
Primijenite naučeno
Vježba: Objava s pozadinskim poslovima
Nakon objave članka generirajte pregled i pošaljite obavijest autoru.
- Spremanje članka ostavite u glavnoj transakciji.
- Jobove pošaljite tek nakon uspješnog commita.
- Dodajte retry, timeout i test da se posao dispatcha.
Za provjeru i nastavak