• Czas czytania ~5 min
  • 28.01.2025

W nowoczesnym programowaniu PHP atrybuty zapewniają ustrukturyzowany sposób dodawania metadanych do klas, metod i właściwości. Zarówno Laravel, jak i Livewire przyjęły tę funkcję, wprowadzając kilka atrybutów, aby usprawnić typowe zadania. Przyjrzyjmy się atrybutom PHP dostarczanym przez Laravel's Container i Livewire, wraz z przykładami dla każdego z nich.

Atrybuty kontenera Laravel Kontener

usług Laravel zawiera atrybuty, które upraszczają rozwiązywanie zależności i wstrzykiwanie usług:

1. #[Auth]

Wstrzykuje menedżera uwierzytelniania do klasy.

Przykład:

use Illuminate\Container\Attributes\Auth;
use Illuminate\Contracts\Auth\Guard;

class PhotoController extends Controller
{
        public function __construct(
        #[Auth('web')]
        protected Guard $auth,
        ) {
            //
        }
}

2. #[Cache]

Wstrzykuje menedżera pamięci podręcznej do klasy.

Przykład:

use Illuminate\Container\Attributes\Cache;
use Illuminate\Contracts\Cache\Repository;

class PhotoController extends Controller
{
        public function __construct(
        #[Cache('redis')]
        protected Repository $cache,
        ) {
            //
        }
}

3. #[Config]

Wstrzykuje wartości konfiguracyjne bezpośrednio do zależności klas.

Przykład:

use Illuminate\Container\Attributes\Config;

class PhotoController extends Controller
{
        public function __construct(
        #[Config('app.timezone')]
        protected string $timezone,
        ) {
            //
        }
}

4. #[CurrentUser]

Wstrzykuje aktualnie uwierzytelnionego użytkownika.

Przykład:

use Illuminate\Container\Attributes\CurrentUser;
use App\Models\User;

class PhotoController extends Controller
{
    public function __construct(
        #[CurrentUser]
        User $currentUser
    ) {
        // $currentUser is the authenticated user instance
    }
}

5. #[DB]

Wstrzykuje określone połączenie z bazą danych.

Przykład:

use Illuminate\Container\Attributes\DB;
use Illuminate\Database\Connection;

class PhotoController extends Controller
{
    public function __construct(
        #[DB('mysql')]
        protected Connection $connection,
    ) {
        // $db is the 'mysql' database connection
    }
}

6. #[Log]

Wstrzykuje instancję rejestratora do klasy.

Przykład:

use Illuminate\Container\Attributes\Log;
use Psr\Log\LoggerInterface;

class PhotoController extends Controller
{
    public function __construct(
        #[Log('daily')]
        protected LoggerInterface $log,
    ) {
        // $logger is the logger instance
    }
}

7. #[RouteParameter]

Wstrzykuje parametr trasy do klasy.

Przykład:

use App\Models\Photo;
use Illuminate\Container\Attributes\RouteParameter;

class PhotoController extends Controller
{
    public function __construct(
        #[RouteParameter('photo')]
        protected Photo $photo,
    ) {
            //
    }
}

8. #[Storage]

Wstrzykuje menedżera pamięci masowej do klasy.

Przykład:

use Illuminate\Container\Attributes\Storage;
use Illuminate\Contracts\Filesystem\Filesystem;

class PhotoController extends Controller
{
    public function __construct(
        #[Storage('local')]
        protected Filesystem $filesystem
    ) {
        //
    }
}

9. #[Tag]

Taguje usługę do późniejszego pobrania.

Przykład:

use Illuminate\Container\Attributes\Tag;

class PhotoController extends Controller
{
    public function __construct(
            #[Tag('reports')]
            protected iterable $reports,
    )
    {
        // ...
    }
}

Atrybuty

Livewire W usłudze Livewire wprowadzono kilka atrybutów zwiększających funkcjonalność komponentu:

1. Computed

Atrybut #[Computed] jest sposobem na tworzenie właściwości "pochodnych" w Livewire. Podobnie jak metody dostępu w modelu Eloquent, obliczone właściwości umożliwiają dostęp do wartości i buforowanie ich w celu uzyskania przyszłego dostępu podczas żądania.

Przykład:

use Livewire\Attributes\Computed;

class UserProfile extends Component
{
        public $firstName;
    public $lastName;

    #[Computed]
    public function getFullName()
    {
        return "{$this->firstName} {$this->lastName}";
    }
}

W tym przykładzie jest właściwością obliczeniową, getFullName która łączy firstName i lastName.

2. Isolate

Korzystając z atrybutu klasy #[Isolate] Livewire, możesz oznaczyć komponent jako "izolowany". Oznacza to, że za każdym razem, gdy ten komponent wykonuje rundę serwera, będzie próbował odizolować się od żądań innych komponentów.

Przykład:

use Livewire\Attributes\Isolate;

#[Isolate]
class TodoList extends Component
{
}

jeśli aktualizacja jest kosztowna i wolisz wykonać aktualizację tego komponentu równolegle z innymi.

3. Js

Atrybut #[Js] służy do powiązania właściwości JavaScript bezpośrednio z komponentem.

Przykład:

use Livewire\Attributes\Js;

class NotificationComponent extends Component
{
    #[Js]
    public $isVisible = true;
}

Ta właściwość może być teraz używana bezpośrednio po stronie JavaScript aplikacji do pokazywania lub ukrywania powiadomień.

4. Layout

Atrybut #[Layout] określa plik układu, który powinien być używany przez komponent

Przykład:

use Livewire\Attributes\Layout;

#[Layout('layouts.dashboard')]
class Dashboard extends Component
{
}

To poinstruuje Livewire, aby wyrenderował komponent w układziedashboard.

5. Lazy

Komponenty ładowane z opóźnieniem nie są w pełni ładowane, dopóki nie wejdą do widocznego obszaru przeglądarki, na przykład, gdy użytkownik przewinie do jednego z nich.

Przykład:

use Livewire\Attributes\Lazy;

#[Lazy]
class UserProfile extends Component
{
    //
}

W takim przypadku właściwość nie zostanie załadowana$profileData, dopóki nie będzie faktycznie potrzebna.

6. Locked

Atrybut #[Locked] zapobiega modyfikowaniu właściwości przez interfejs użytkownika.

Przykład:

use Livewire\Attributes\Locked;

class UserSettings extends Component
{
    #[Locked]
    public $userId;
}

W tym przykładzie $userId nie można zaktualizować właściwości z poziomu frontonu.

7. Modelable

Atrybut #[Modelable] jest używany do powiązania tylko jednej właściwości komponentu podrzędnego z jego komponentem nadrzędnym.

Przykład:

use Livewire\Attributes\Modelable;

class PostForm extends Component
{
    #[Modelable]
    public $title;
}

8. On

Atrybut #[On] wiąże akcję lub metodę z określonym zdarzeniem.

Przykład:

use Livewire\Attributes\On;

class UserRegistered extends Component
{
    #[On('userRegistered')]
    public function handleNewUser($user)
    {
        // Handle the registration event
    }
}

W tym przykładzie metoda handleNewUser zostanie wywołana po wyzwoleniu userRegistered zdarzenia.

9. Reactive

Atrybut #[Reactive] oznacza właściwość jako reaktywną, co oznacza, że wszystkie właściwości komponentu podrzędnego zostaną automatycznie zaktualizowane w interfejsie użytkownika, gdy coś w komponencie nadrzędnym ulegnie zmianie.

Przykład:

use Livewire\Attributes\Reactive;

class Counter extends Component
{
    #[Reactive]
    public $count = 0;

    public function increment()
    {
        $this->count++;
    }
}

10. Renderless

Atrybut #[Renderless] jest używany do wskazania, że komponent nie renderuje żadnego widoku, ale może być używany do celów logicznych.

Przykład:

use Livewire\Attributes\Renderless;

class FormLogic extends Component
{
    #[Renderless]
    public function validateForm()
    {
        // Perform form validation logic
    }
}

ale może obsłużyć logikę walidacji formularza.

11. Rule

Atrybut #[Rule] służy do definiowania niestandardowych reguł walidacji właściwości komponentu.

Przykład:

use Livewire\Attributes\Rule;

class RegisterUser extends Component
{
    #[Rule('required|string|max:255')]
    public $username;
}

Spowoduje to wymuszenie reguły walidacji we właściwości.

$username 12. Session

Atrybut #[Session] wiąże właściwość komponentu z sesją.

Przykład:

use Livewire\Attributes\Session;

class UserProfile extends Component
{
    #[Session]
    public $theme;
}

To przechowuje $theme właściwość w sesji, dzięki czemu jest zachowywana między żądaniami.

13. Title

Atrybut #[Title] pozwala na określenie tytułu widoku komponentu.

Przykład:

use Livewire\Attributes\Title;

#[Title('My Custom Page Title')]
class PageTitle extends Component
{
    public function render()
    {
        return view('page');
    }
}

Spowoduje to ustawienie tytułu strony na "Mój niestandardowy tytuł strony".

14. Url

Atrybut #[Url] wiąże właściwość z adresem URL.

Przykład:

use Livewire\Attributes\Url;

class Navigation extends Component
{
    #[Url]
    public $currentUrl = '';
}

To sprawia, $currentUrl że właściwość automatycznie odzwierciedla adres URL bieżącej strony.

Dzięki

23 atrybutom PHP w Laravelu i Livewire, programiści mają do dyspozycji szeroką gamę narzędzi do upraszczania przepływów pracy, poprawy przejrzystości kodu i wykorzystania nowoczesnych praktyk PHP. Te atrybuty redukują boilerplate i wprowadzają wyraziste, deklaratywne kodowanie do aplikacji.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297

Codziennie zestrzeliwujemy „Shahedy”. Za każdym razem to uratowane życie. Potrzebujemy mobilności: busa lub przyczepy. Każda wpłata = kolejna noc pod ochroną.

🚐 Zbiórka na busa dla zespołu, pułk 1020 🎯 Cel: 500 000 ₴
🔗 Link do zbiórkiі 💳 4441 1111 2546 4663