<?> PHP NOVA invictum.hr
Izdanje 2026.
Poglavlje 44

Laravel servisi

Aplikaciju širimo servisnim spremnikom, redovima poslova, događajima, cacheom, mailom i schedulerom uz jasnu pouzdanost.

33 min čitanja Napredno razina PHP 8.5 ciljna verzija

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.

Vezanje ovisnosti
<?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.

Queue job
<?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.

Cache i scheduler
<?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.

  1. Spremanje članka ostavite u glavnoj transakciji.
  2. Jobove pošaljite tek nakon uspješnog commita.
  3. Dodajte retry, timeout i test da se posao dispatcha.

Za provjeru i nastavak

Službeni izvori