2.6. Хуки жизненного цикла

Livewire предоставляет различные хуки жизненного цикла, которые позволяют выполнять код в определенные моменты жизненного цикла компонента. Эти хуки позволяют выполнять действия до или после конкретных событий, таких как инициализация компонента, обновление свойств или рендеринг шаблона.

Вот список всех доступных хуков жизненного цикла компонента:

Метод хука Описание
mount() Вызывается при создании компонента
hydrate() Вызывается при повторной инициализации компонента в начале следующего запроса
boot() Вызывается в начале каждого запроса. Как для первоначального, так и для последующих
updating() Вызывается перед обновлением свойства компонента
updated() Вызывается после обновления свойства
rendering() Вызывается перед вызовом render()
rendered() Вызывается после вызова render()
dehydrate() Вызывается в конце каждого запроса компонента
exception($e, $stopPropagation) Вызывается при возникновении исключения

1. Mount

В стандартном PHP классе конструктор (__construct()) принимает внешние параметры и инициализирует состояние объекта. Однако в Livewire для принятия параметров и инициализации состояния компонента используется метод mount().

Компоненты Livewire не используют __construct(), потому что компоненты Livewire пересоздаются при последующих сетевых запросах, и мы хотим инициализировать компонент только один раз, когда он создается впервые.

Вот пример использования метода mount() для инициализации свойств name и email компонента UpdateProfile:

use Illuminate\Support\Facades\Auth;
use Livewire\Component;
 
class UpdateProfile extends Component
{
public $name;
 
public $email;
 
public function mount()
{
$this->name = Auth::user()->name;
 
$this->email = Auth::user()->email;
}
 
// ...
}

Как упоминалось ранее, метод mount() принимает данные, переданные в компонент, в качестве параметров метода:

use Livewire\Component;
use App\Models\Post;
 
class UpdatePost extends Component
{
public $title;
 
public $content;
 
public function mount(Post $post)
{
$this->title = $post->title;
 
$this->content = $post->content;
}
 
// ...
}
Вы можете использовать внедрение зависимостей со всеми методами хуков

Livewire позволяет разрешать зависимости из сервис-контейнера Laravel с помощью указания типа параметров метода в хуках жизненного цикла.

Метод mount() является важной частью работы с Livewire. Следующая документация предоставляет дополнительные примеры использования метода mount() для выполнения общих задач:

2. Boot

Насколько полезен метод mount(), он выполняется только один раз за весь жизненный цикл компонента, и вам может понадобиться выполнить логику в начале каждого запроса к серверу для данного компонента.

Для таких случаев Livewire предоставляет метод boot(), в котором можно написать код настройки компонента, который вы хотите выполнить каждый раз, когда класс компонента загружается: как при инициализации, так и при последующих запросах.

Метод boot() может быть полезен для таких задач, как инициализация защищенных свойств, которые не сохраняются между запросами. Ниже приведен пример инициализации защищенного свойства как модели Eloquent:

use Livewire\Attributes\Locked;
use Livewire\Component;
use App\Models\Post;
 
class ShowPost extends Component
{
#[Locked]
public $postId = 1;
 
protected Post $post;
 
public function boot()
{
$this->post = Post::find($this->postId);
}
 
// ...
}

Вы можете использовать эту технику, чтобы полностью контролировать инициализацию свойства компонента в вашем компоненте Livewire.

Чаще всего вы можете использовать вычисляемое свойство вместо этого.

Используемая выше техника мощная; однако, часто лучше использовать вычисляемые свойства Livewire для решения этой задачи.

Всегда защищайте чувствительные публичные свойства

Как видно выше, мы используем атрибут #[Locked] для свойства $postId. В таком сценарии, как показано выше, когда необходимо убедиться, что свойство $postId не будет изменено пользователями на стороне клиента, важно авторизовать его значение перед использованием или добавить #[Locked] к свойству, чтобы гарантировать, что оно никогда не будет изменено.

Для получения дополнительной информации ознакомьтесь с документацией по заблокированным свойствам.

3. Update

Пользователи на стороне клиента могут обновлять публичные свойства разными способами, наиболее часто — изменяя значение поля ввода с атрибутом wire:model.

Livewire предоставляет удобные хуки для перехвата обновления публичного свойства, чтобы вы могли валидировать или авторизовать значение перед его установкой, или убедиться, что свойство установлено в заданном формате.

Ниже приведен пример использования updating для предотвращения изменения свойства $postId.

Стоит отметить, что для этого конкретного примера в реальном приложении вам следует использовать #[Locked] атрибут вместо этого, как в примере выше.