• Время чтения ~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]

Внедряет экземпляр регистратора в класс

Пример:

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]

Внедряет параметр маршрута в класс

Пример:

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