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.