Laravel's AsHtmlString клас для елегантного управління HTML-атрибутами

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 25 квітня, 2025
Laravel 12.4 вносить революцію в роботу з HTML-контентом у моделях Eloquent завдяки новому касту AsHtmlString. Чи готові ви спростити обробку HTML у ваших проєктах? Читайте далі, щоб дізнатися, як цей новий функціонал зменшить обсяг вашого коду та підвищить безпеку типів у вашій розробці

Laravel v12.4 представляє каст AsHtmlString, який кардинально змінює спосіб роботи розробників з HTML-контентом у моделях Eloquent. Ця функція автоматизує перетворення текстових атрибутів у екземпляри HtmlString, позбавляючи від потреби в ручних конвертаціях.

Багатий контент, збережений у базах даних, зазвичай має відображатися без ескейпування HTML. Хоча клас HtmlString уже використовувався в Laravel для цього, його впровадження вимагало написання кастомних аксесорів або ручного перетворення. Каст AsHtmlString спрощує цей процес:

use Illuminate\Database\Eloquent\Casts\AsHtmlString;
use Illuminate\Database\Eloquent\Model;

class Newsletter extends Model
{
    protected function casts(): array
    {
        return [
            'content' => AsHtmlString::class,
        ];
    }
}

Тепер, коли каст застосовано, доступ до атрибута content автоматично повертає екземпляр HtmlString:

$newsletter = Newsletter::find(1);
$newsletter->content; // Екземпляр \Illuminate\Support\HtmlString

Раніше розробникам доводилося обробляти HTML-контент за допомогою аксесорів або ручного перетворення:

// Використання аксесуара
protected function content(): Attribute
{
    return Attribute::make(
        get: fn (string $value) => str($value)->toHtmlString(),
    );
}

// Або ручне перетворення за потреби
$htmlContent = new HtmlString($newsletter->content);
$htmlContent = str($newsletter->content)->toHtmlString();

Цей каст спрощує управління контентом у системах і додатках, що працюють з відформатованим текстом. Наприклад, модель продукту в електронній комерції може зберігати HTML-форматовані описи:

class Product extends Model
{
    protected function casts(): array
    {
        return [
            'name' => 'string',
            'description' => AsHtmlString::class,
            'features' => AsHtmlString::class,
            'sku' => 'string', // Звичайний рядок, буде ескейплений
        ];
    }
}

З такою конфігурацією шаблони Blade відображають HTML-контент безпосередньо:

<div class="product">
    <h2>{{ $product->name }}</h2> <!-- Буде ескейплено -->
    <div class="description">
        {{ $product->description }} <!-- Не буде ескейплено -->
    </div>
    <ul class="features">
        {{ $product->features }} <!-- Не буде ескейплено -->
    </ul>
</div>

Каст AsHtmlString усуває повторення коду, підвищуючи експресивність моделей та типову безпеку у всіх додатках Laravel