В современной разработке на 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. Эти атрибуты сокращают шаблонность и привносят выразительное декларативное кодирование в приложения.