Optimiza el manejo de atributos HTML con la nueva conversión AsHtmlString de Laravel
- Publicado el 22 abril, 2025
- Palabras: 169
¿Trabajas con contenido HTML almacenado en tu base de datos? Laravel v12.4 introduce la conversión AsHtmlString, que proporciona una forma elegante de gestionar atributos con formato HTML en tus modelos Eloquent.

Al trabajar con contenido enriquecido o texto formateado en la base de datos, a menudo es necesario mostrarlo sin escape HTML. Laravel cuenta desde hace tiempo con la clase HtmlString para este propósito, pero usarla con atributos de Eloquent requería accessors personalizados o conversión manual. La nueva conversión AsHtmlString simplifica este flujo de trabajo al convertir automáticamente los atributos de strings en instancias de HtmlString.
Veamos cómo funciona:
use Illuminate\Database\Eloquent\Casts\AsHtmlString;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected function casts(): array
{
return [
'content' => AsHtmlString::class,
];
}
}
Con esta conversión en su lugar, cada vez que acceda al atributo content, automáticamente será una instancia de HtmlString:
$article = Article::find(1);
$article->content; // Instance of IlluminateSupportHtmlString
#Enfoques anteriores
Antes de que este formato estuviera disponible, normalmente se manejaba el contenido HTML de una de estas maneras:
// Usando un accessor
protected function content(): Attribute
{
return Attribute::make(
get: fn (string $value) => str($value)->toHtmlString(),
);
}
// O convertir manualmente cuando sea necesario
$htmlContent = new HtmlString($article->content);
$htmlContent = str($article->content)->toHtmlString();
#Ejemplo práctico
Este formato es particularmente útil para sistemas de gestión de contenido o aplicaciones que almacenan texto formateado:
class BlogPost extends Model
{
protected function casts(): array
{
return [
'title' => 'string',
'body' => AsHtmlString::class,
'excerpt' => AsHtmlString::class,
'meta_description' => 'string', // Regular string, will be escaped
];
}
}
En sus plantillas Blade, ahora puedes generar el contenido HTML directamente:
<article>
<h1>{{ $post->title }}</h1> <!-- Will be escaped -->
<div class="content">
{{ $post->body }} <!-- Will NOT be escaped -->
</div>
<div class="excerpt">
{{ $post->excerpt }} <!-- Will NOT be escaped -->
</div>
</article>
Si bien esto puede parecer un caso de uso limitado, aborda una necesidad común en muchas aplicaciones web, eliminando código repetitivo y haciendo que sus modelos sean más expresivos y seguros en cuanto a tipos.
Fuente: Harris Raftopoulos
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión