Poznajemy lepiej komponenty Laravela oraz zastanawiamy się, czy aby na pewno chcemy ich używać. Do dzieła.

Ok, pierwsza rzecz, której nie znamy – metoda shouldRender:

public function shouldRender(): bool
{
    return Str::length($this->message) > 0;
}

Druga rzecz to znak :: zamiast : i nie jest to scope resolution operator – tylko sposób, aby komponenty Laravela nie gryzły się z frameworkami frontendowymi, które tej samej notacji (:[atrybut]) używają:

<x-button ::class="{ danger: isDeleting }">
    Submit
</x-button>

Mamy też sloty:

<div class="alert alert-danger">
    {{ $slot }}
</div>

Nazwane sloty:

<x-alert>
    <x-slot:title>
        Server Error
    </x-slot>
 
    <strong>Whoops!</strong> Something went wrong!
</x-alert>

Atrybuty:

@props([
    'heading',
    'footer',
])
 
<div {{ $attributes->class(['border']) }}>
    <h1 {{ $heading->attributes->class(['text-lg']) }}>
        {{ $heading }}
    </h1>
 
    {{ $slot }}
 
    <footer {{ $footer->attributes->class(['text-gray-700']) }}>
        {{ $footer }}
    </footer>
</div>

Nested components:

<x-menu color="purple">
    <x-menu.item>...</x-menu.item>
    <x-menu.item>...</x-menu.item>
</x-menu>

Wtedy props może służyć nie tylko do ominięcia klasy (komponenty utworzone z flagą –view) ale także do przekazywania atrybutów w dół:

@props(['color' => 'gray'])
 
<ul {{ $attributes->merge(['class' => 'bg-'.$color.'-200']) }}>
    {{ $slot }}
</ul>

Komponent-odbiorca musi potwierdzić, że jest świadomy tego, co może do niego spłynąć:

@aware(['color' => 'gray'])
 
<li {{ $attributes->merge(['class' => 'text-'.$color.'-800']) }}>
    {{ $slot }}
</li>

Natomiast zanim się zaczniemy podniecać, musimy zrozumieć pewne rzeczy:

  • Laravel jest frameworkiem backendowym
  • Komponenty to iście frontendowa rzecz
  • Większość frameworków frontendowych zapewnia komponenty

To wszystko oznacza, że po pierwsze, pewne rzeczy mogą nam źle działać. Komponenty nigdy nie były główną osią Laravela, ani nawet czymś o znaczeniu drugorzędnym, ale jednak ważnym. I jeżeli do dzisiaj są rozkminy jak dodać x-forwarded-by czy jakiś inny custom header do projektu Laravela, to możemy być pewni, że będą błędy w komponentach.

Nie będzie działać jak należy, będzie wymagało jakichś dodatkowych czarów (oby tylko to), które w dodatku nie są nigdzie udokumentowane i tylko niewielka grupka ludzi, którzy się tym zajmują to umie robić dobrze i dla nich jest to oczywiste.

Komponenty jako coś pobocznego i niszowego w Laravelu będą słabo udokumentowane zaś błędy będą wykrywane późno i późno naprawiane. Z obsługą komponentów będą sobie radzić ludzie, którzy poświęcili im trochę czasu.

Są też pewne ograniczenia Laravela jako frameworka backendowego w stosunku do tego co może zapewnić komponentom, oraz Laravela jako frameworka, którego Blade components jest jakimś tam niszowym elementem.

To sprawia, że wszystko, co będziemy robić przy pomocy komponentów + AlpineJS będzie od nas wymagało kreatywności. Jeżeli dotychczas robiliśmy w bardzo dobrze znanych i opisanych frameworkach, to możemy nawet nie zdawać sobie sprawy z tego, jak bardzo jesteśmy słabi gdy musimy sami coś wymyślić.

Mamy do dyspozycji i komponenty i AlpineJS i sami musimy wpaść na to jak to kreatywnie pospinać, aby wyszła działająca całość. Dodaj do tego słabą dokumentację, słabe przykłady i potencjalne błędy, późno wykrywane i wolno naprawiane i wychodzi na to, że to wcale nie jest droga na skróty.

Mało tego, jeżeli jesteśmy z tych, co to ich programować sztuczna inteligencja uczyła, to tym bardziej model językowy nam nie pomoże. Model językowy zna się na tym, co właśnie dobrze znane, dobrze opisane i ma milion przykładów. WordPressa klasycznego może nas uczyć, przy tym z Reactem się gubi i kluczy, można sobie wyobrazić, jak bardzo „mądre” będą jego rady i przykłady, gdy będzie musiał wziąć mało znaną paczkę Alpine, niszową funkcjonalność Laravela Blade Components, pomyśleć (skrót myślowy) i jakoś mądrze to pospinać.

Dlatego może warto rozważyć inny kierunek – backend w PHP, frontend w JS. Inertia spina wszystko. Plus operujemy w dwóch dobrze udokumentowanych językach, znanych i lubianych, z frameworkami dobrze opisanymi i wspieranymi, wyznaczającymi wręcz pewne standardy.

Moje zdanie jest takie, że trzeba umieć wszystko, ale należy mieć jakieś preferencje. I osobiście tak jak backend wolę zostawić PHPowi o tyle reaktywność to domena JSa i frameworków frontendowych.

A jak będę chciał napisać Apkę na androida, do się polubię z Javą i Android Studio, a jak GUI, to C#. I pal 6, że moim pierwszym językiem był Python, robienie tych rzeczy w Pythonie jest właśnie jak robienie reaktywności przez Blade Components + Alpine (Alpine sam w sobie jest świetną paczką).

Po prostu dobiera się odpowiednie narzędzia do zadania, zaś nauczenie się nowego języka wcale nie jest takie trudne, jeżeli znamy koszty i ograniczenia pozostania w tym, co niby znamy, ale do zadania się średnio nadaje, albo wręcz nie nadaje.

Decyzję pozostawiam czytelnikowi.