Asociación elegante de Factories con el atributo UseFactory de Laravel
- Publicado el 17 febrero, 2025
- Palabras: 142
¿Necesitas una forma más clara de asociar Factories con tus modelos Eloquent? El nuevo atributo UseFactory de Laravel ofrece una solución elegante que utiliza atributos de PHP 8.0+, especialmente útil para modelos fuera del espacio de nombres estándar.

#Uso básico
El registro de Factories en Laravel requería tradicionalmente seguir convenciones de nomenclatura estrictas o definir manualmente los métodos de factory. El nuevo atributo UseFactory simplifica este proceso al proporcionar una forma declarativa de especificar asociaciones de fábricas directamente en sus modelos.Veamos cómo funciona:
use Database\Factories\Comment\Factory;
use Illuminate\Database\Eloquent\Attributes\UseFactory;
#[UseFactory(CommentFactory::class)]
class Comment extends Model
{
use HasFactory;
}
#Ejemplo práctico
A continuación se muestra cómo podría usarlo en una estructura impulsada por dominio:
// Post model
namespace App\Domains\Blog\Models;
use Database\Factories\Post\Factory;
use Illuminate\Database\Eloquent\Attributes\UseFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
#[UseFactory(PostFactory::class)]
class Post extends Model
{
use HasFactory;
protected $fillable = ['title', 'content', 'status'];
#[UseFactory(CommentFactory::class)]
public function comments(): HasMany
{
return $this->hasMany(Comment::class);
}
}
// Product model
namespace App\Domains\Shop\Models;
#[UseFactory(ProductFactory::class)]
class Product extends Model
{
use HasFactory;
// No need to define newFactory() or $model property
// The factory association is handled by the attribute
}
El atributo UseFactory aporta varias ventajas sobre los métodos de registro de factory tradicionales. Proporciona una asociación clara y visible entre los modelos y sus factories, manteniendo la compatibilidad con versiones anteriores de los enfoques existentes. Laravel sigue un orden de prioridad al resolver factories:
- Propiedad estática $factory si está definida
- Atributo UseFactory si está presente
- Resolución de factory basada en convenciones
Piense en él como un decorador para sus modelos: indica claramente qué fábrica debe usarse sin requerir definiciones de métodos adicionales ni convenciones de nomenclatura estrictas.
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