У сучасній розробці PHP атрибути надають структурований спосіб додавання метаданих до класів, методів та властивостей. І Laravel, і Livewire скористалися цією функцією, представивши кілька атрибутів для оптимізації звичайних завдань. Давайте розглянемо атрибути PHP, надані Laravel's Container і Livewire, а також наведемо приклади для кожного з них.
Атрибути контейнера
Laravel Сервісний контейнер Laravel включає атрибути, які спрощують вирішення залежностей та впровадження сервісу:
1. #[Auth]
Впроваджує менеджер аутентифікації в клас.
Приклад:
use Illuminate\Container\Attributes\Auth;
use Illuminate\Contracts\Auth\Guard;
class PhotoController extends Controller
{
public function __construct(
#[Auth('web')]
protected Guard $auth,
) {
//
}
}
2. #[Cache]
Впроваджує менеджер кешу в клас
Приклад:
use Illuminate\Container\Attributes\Cache;
use Illuminate\Contracts\Cache\Repository;
class PhotoController extends Controller
{
public function __construct(
#[Cache('redis')]
protected Repository $cache,
) {
//
}
}
3. #[Config]
Вводить значення конфігурації безпосередньо в залежності класів.
Приклад:
use Illuminate\Container\Attributes\Config;
class PhotoController extends Controller
{
public function __construct(
#[Config('app.timezone')]
protected string $timezone,
) {
//
}
}
4. #[CurrentUser]
Вводить поточного автентифікованого користувача.
Приклад:
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]
Вводить конкретне з'єднання з базою даних.
Приклад:
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]
Впроваджує екземпляр logger у клас
Приклад:
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]
Вводить параметр route у клас.
Приклад:
use App\Models\Photo;
use Illuminate\Container\Attributes\RouteParameter;
class PhotoController extends Controller
{
public function __construct(
#[RouteParameter('photo')]
protected Photo $photo,
) {
//
}
}
8. #[Storage]
Впроваджує менеджер сховища в клас.
Приклад:
use Illuminate\Container\Attributes\Storage;
use Illuminate\Contracts\Filesystem\Filesystem;
class PhotoController extends Controller
{
public function __construct(
#[Storage('local')]
protected Filesystem $filesystem
) {
//
}
}
9. #[Tag]
Позначає службу для подальшого пошуку.
Приклад:
use Illuminate\Container\Attributes\Tag;
class PhotoController extends Controller
{
public function __construct(
#[Tag('reports')]
protected iterable $reports,
)
{
// ...
}
}
Атрибути
Livewire Livewire вводить кілька атрибутів для покращення функціональності компонентів:
1. Computed
Атрибут #[Computed] - це спосіб створення "похідних" властивостей у Livewire. Подібно до аксесорів у моделі Eloquent, обчислювані властивості дозволяють отримувати доступ до значень і кешувати їх для подальшого доступу під час запиту.
Приклад:
use Livewire\Attributes\Computed;
class UserProfile extends Component
{
public $firstName;
public $lastName;
#[Computed]
public function getFullName()
{
return "{$this->firstName} {$this->lastName}";
}
}
У цьому прикладі є обчислюваною властивістю, getFullName яка поєднує firstName та lastName.
2. Isolate
Використовуючи атрибут класу #[Isolate] Livewire, ви можете позначити компонент як "ізольований". Це означає, що кожного разу, коли цей компонент здійснює обхід сервера, він намагатиметься ізолювати себе від інших запитів компонентів.
Приклад:
use Livewire\Attributes\Isolate;
#[Isolate]
class TodoList extends Component
{
}
Це корисно, якщо оновлення дороге і ви віддаєте перевагу виконанню оновлення цього компонента паралельно з іншими.
3. Js
Атрибут #[Js] використовується для прив'язки властивості JavaScript безпосередньо до компонента.
Приклад:
use Livewire\Attributes\Js;
class NotificationComponent extends Component
{
#[Js]
public $isVisible = true;
}
Ця властивість тепер може використовуватися безпосередньо на стороні JavaScript програми, щоб показувати або приховувати сповіщення.
4. Layout
Атрибут #[Layout] вказує файл макету, який повинен використовуватися компонентом.
Приклад:
use Livewire\Attributes\Layout;
#[Layout('layouts.dashboard')]
class Dashboard extends Component
{
}
Це наказує Livewire відтворити компонент у макетіdashboard.
5. Lazy
Відкладено завантажені компоненти не завантажуються повністю, поки вони не потраплять у вікно перегляду браузера, наприклад, коли користувач прокручує до одиниці.
Приклад:
use Livewire\Attributes\Lazy;
#[Lazy]
class UserProfile extends Component
{
//
}
У цьому випадку, властивість $profileData не буде завантажуватися, поки вона дійсно не буде потрібна.
6. Locked
Атрибут #[Locked] запобігає зміні властивості фронтендом.
Приклад:
use Livewire\Attributes\Locked;
class UserSettings extends Component
{
#[Locked]
public $userId;
}
У цьому прикладі властивість $userId не може бути оновлена з фронтенду.
7. Modelable
Атрибут #[Modelable] використовується для прив'язування тільки однієї властивості дочірнього компонента з його батьківського компонента.
Приклад:
use Livewire\Attributes\Modelable;
class PostForm extends Component
{
#[Modelable]
public $title;
}
8. On
Атрибут #[On] прив'язує дію або метод до певної події.
Приклад:
use Livewire\Attributes\On;
class UserRegistered extends Component
{
#[On('userRegistered')]
public function handleNewUser($user)
{
// Handle the registration event
}
}
У цьому прикладі метод handleNewUser буде викликаний, коли userRegistered подія спрацьовує.
9. Reactive
Атрибут #[Reactive] позначає властивість як реактивну, тобто будь-які властивості дочірнього компонента автоматично оновлюються на фронтенді, коли щось у батьківському компоненті змінюється.
Приклад:
use Livewire\Attributes\Reactive;
class Counter extends Component
{
#[Reactive]
public $count = 0;
public function increment()
{
$this->count++;
}
}
10. Renderless
Атрибут #[Renderless] використовується для позначення того, що компонент не відображає жодного представлення, але він може бути використаний для логічних цілей.
Приклад:
use Livewire\Attributes\Renderless;
class FormLogic extends Component
{
#[Renderless]
public function validateForm()
{
// Perform form validation logic
}
}
Цей клас не відображатиме жодного представлення, але може обробляти логіку перевірки форми.
11. Rule
Атрибут #[Rule] використовується для визначення користувальницьких правил перевірки властивостей компонентів.
Приклад:
use Livewire\Attributes\Rule;
class RegisterUser extends Component
{
#[Rule('required|string|max:255')]
public $username;
}
Це призведе до застосування правила перевірки властивості $username .
12. Session
Атрибут #[Session] прив'язує властивість компонента до сеансу.
Приклад:
use Livewire\Attributes\Session;
class UserProfile extends Component
{
#[Session]
public $theme;
}
Це зберігає властивість $theme у сеансі, тому вона зберігається за різними запитами.
13. Title
Атрибут #[Title] дозволяє вказати заголовок представлення компонента.
Приклад:
use Livewire\Attributes\Title;
#[Title('My Custom Page Title')]
class PageTitle extends Component
{
public function render()
{
return view('page');
}
}
Це встановить заголовок сторінки як "Мій власний заголовок сторінки".
14. Url
Атрибут #[Url] прив'язує властивість до URL.
Приклад:
use Livewire\Attributes\Url;
class Navigation extends Component
{
#[Url]
public $currentUrl = '';
}
Це змушує властивість $currentUrl автоматично відображати URL-адресу поточної сторінки.
Висновок
Завдяки 23 атрибутам PHP у Laravel і Livewire розробники мають широкий спектр інструментів для спрощення робочих процесів, підвищення чіткості коду та використання сучасних практик PHP. Ці атрибути зменшують шаблонність і привносять виразне, декларативне кодування до ваших програм.