Laravel Tutorials

Laravel's AsHtmlString Cast for Elegant HTML Attribute Management

Published
Laravel's AsHtmlString Cast for Elegant HTML Attribute Management image

Laravel v12.4 brings the AsHtmlString cast, transforming the way developers work with HTML content in Eloquent models. This feature automates the conversion of string attributes to HtmlString instances, eliminating manual conversions.

Rich content stored in databases typically requires display without HTML escaping. The HtmlString class has been part of Laravel for this purpose, but implementing it meant writing custom accessors or performing manual conversions. The AsHtmlString cast streamlines this process:

use Illuminate\Database\Eloquent\Casts\AsHtmlString;
use Illuminate\Database\Eloquent\Model;
 
class Newsletter extends Model
{
protected function casts(): array
{
return [
'content' => AsHtmlString::class,
];
}
}

With the cast applied, accessing the content attribute automatically returns an HtmlString instance:

$newsletter = Newsletter::find(1);
$newsletter->content; // Instance of \Illuminate\Support\HtmlString

Previously, developers needed to handle HTML content using accessors or manual conversions:

// Using an accessor
protected function content(): Attribute
{
return Attribute::make(
get: fn (string $value) => str($value)->toHtmlString(),
);
}
 
// Or manual conversion when needed
$htmlContent = new HtmlString($newsletter->content);
$htmlContent = str($newsletter->content)->toHtmlString();

The cast simplifies content management systems and applications with formatted text. Consider an e-commerce product model storing HTML-formatted descriptions:

class Product extends Model
{
protected function casts(): array
{
return [
'name' => 'string',
'description' => AsHtmlString::class,
'features' => AsHtmlString::class,
'sku' => 'string', // Regular string, will be escaped
];
}
}

With this configuration, Blade templates display HTML content directly:

<div class="product">
<h2>{{ $product->name }}</h2> <!-- Will be escaped -->
<div class="description">
{{ $product->description }} <!-- Will NOT be escaped -->
</div>
<ul class="features">
{{ $product->features }} <!-- Will NOT be escaped -->
</ul>
</div>

The AsHtmlString cast removes repetitive code while enhancing model expressiveness and type safety throughout Laravel applications.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
Volker Dusch on the PHP RCE Vulnerabilities and Disclosure image

Volker Dusch on the PHP RCE Vulnerabilities and Disclosure

Read article
Decide with Jev: Turn AI Answers into Decisions with PHP Rules image

Decide with Jev: Turn AI Answers into Decisions with PHP Rules

Read article
Skuul: Open-Source School Management Built on Laravel image

Skuul: Open-Source School Management Built on Laravel

Read article
Laravel Read Replicas: Prevent Stale Reads After a Write image

Laravel Read Replicas: Prevent Stale Reads After a Write

Read article
Screenshot: Capture Images and PDFs with PHP and Laravel image

Screenshot: Capture Images and PDFs with PHP and Laravel

Read article
Reset Sticky Database Connections Between Laravel Queue Jobs image

Reset Sticky Database Connections Between Laravel Queue Jobs

Read article