Метод directive
Метод directive класса Livewire предназначен для динамической регистрации пользовательских директив в Livewire. Он принимает два параметра: имя директивы и коллбэк-функцию, которая определяет поведение директивы. Коллбэк получает выражение, переданное директиве, и должен возвращать строку с PHP-кодом для исполнения. Этот метод позволяет расширять синтаксис Livewire, создавая собственные директивы для повторяющихся задач.
Синтаксис
<?php
use Livewire\Livewire;
Livewire::directive('directiveName', function ($expression) {
return '<?php echo ' . $expression . '; ?>';
});
?>
Пример
Давайте зарегистрируем простую директиву @greet, которая приветствует пользователя:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Livewire\Livewire;
class LivewireServiceProvider extends ServiceProvider
{
public function boot()
{
Livewire::directive('greet', function ($expression) {
return "<?php echo 'Hello, ' . {$expression}; ?>";
});
}
}
?>
<div>
<p>@greet('John')</p>
<p>@greet($userName)</p>
</div>
Результат выполнения кода:
<p>Hello, John</p>
<p>Hello, Alex</p>
Пример
Создадим директиву @upper, преобразующую текст в верхний регистр:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Livewire\Livewire;
class LivewireServiceProvider extends ServiceProvider
{
public function boot()
{
Livewire::directive('upper', function ($expression) {
return "<?php echo mb_strtoupper({$expression}); ?>";
});
}
}
?>
<div>
<p>Original: {{ $text }}</p>
<p>Uppercase: @upper($text)</p>
</div>
<?php
namespace App\Livewire;
use Livewire\Component;
class Text extends Component
{
public $text = 'Livewire';
public function render()
{
return view('livewire.text');
}
}
?>
Результат выполнения кода:
<p>Original: Livewire</p>
<p>Uppercase: LIVEWIRE</p>
Пример
Зарегистрируем директиву @currency для форматирования чисел как валюты:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Livewire\Livewire;
class LivewireServiceProvider extends ServiceProvider
{
public function boot()
{
Livewire::directive('currency', function ($expression) {
return "<?php echo '$' . number_format({$expression}, 2); ?>";
});
}
}
?>
<div>
<p>Price: @currency($price)</p>
<p>Total: @currency($total)</p>
</div>
<?php
namespace App\Livewire;
use Livewire\Component;
class Price extends Component
{
public $price = 99.95;
public $total = 299.50;
public function render()
{
return view('livewire.price');
}
}
?>
Результат выполнения кода:
<p>Price: $99.95</p>
<p>Total: $299.50</p>