• Час читання ~5 хв
  • 28.01.2025

У сучасній розробці 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. Ці атрибути зменшують шаблонність і привносять виразне, декларативне кодування до ваших програм.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

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...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297

Ми знищуємо "шахеди" щодня. Щоразу — це врятовані життя. Але нам потрібна мобільність: бус або прицеп. Кожен донат = ще одна ніч під захистом.

🚐 Збір на бус для мого екіпажу, полк 1020 🎯 Ціль: 500 000 ₴
🔗 Посилання на банку 💳 4441 1111 2546 4663