Laravel's AsHtmlString Cast for Elegant HTML Attribute Management
Last updated on by Harris Raftopoulos

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 accessorprotected 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.