Simplificación y modificación de la creación de objetos con el helper with() de Laravel

  • Publicado el 04 septiembre, 2024
  • Palabras: 845

El helper with() de Laravel es una función simple pero poderosa que permite a los desarrolladores crear y modificar objetos en una sola operación fluida. Este asistente puede mejorar significativamente la legibilidad del código y reducir la cantidad de líneas necesarias para la configuración de objetos. Exploremos cómo aprovechar este útil asistente en sus proyectos de Laravel.

Simplificación y modificación de la creación de objetos con el helper with() de Laravel

#Uso básico de with()

 

El helper with() toma dos argumentos: un objeto (o valor) y un clousure. Aplica el clousure al objeto y luego devuelve el objeto resultante. A continuación, se muestra un ejemplo sencillo:

 

$user = with(new User, function ($user) {
    $user->name = 'John Doe';
    $user->email = 'john@example.com';
    return $user;
});

 

Esto crea un nuevo objeto User, establece sus propiedades de name y email y devuelve el objeto modificado.

 

#Simplificando la configuración de objetos complejos

 

El helper with() funciona al configurar objetos complejos:

 

$response = with(new Response('Hello'), function ($response) {
    return $response->header('X-Custom', 'Value')
                    ->cookie('name', 'value', 60);
});

 

Esto crea un nuevo objeto Response, agrega un encabezado personalizado y una cookie y todo en una operación fluida.

 

#Usando with() con los Model Factories

 

El helper with() puede ser particularmente útil en los model factories:

 

use App\Models\Post;

class PostFactory extends Factory
{
    public function definition()
    {
        return [
            'title' => $this->faker->sentence,
            'content' => $this->faker->paragraphs(3, true),
            'published_at' => $this->faker->dateTimeBetween('-1 year', 'now'),
        ];
    }

    public function published()
    {
        return $this->state(function (array $attributes) {
            return with($attributes, function (&$attrs) {
                $attrs['published_at'] = now();
                $attrs['is_published'] = true;
                return $attrs;
            });
        });
    }
}

 

Aquí with() se utiliza para modificar el array de atributos en un estado de post publicado.

 

#Modificación de objetos condicionales

 

Puedes utilizar with() para modificar objetos condicionales:

 

$user = with(new User, function ($user) use ($request) {
    $user->name = $request->name;
    $user->email = $request->email;
    
    if ($request->has('role')) {
        $user->role = $request->role;
    }
    
    return $user;
});

 

Esta configuración permite la creación flexible de objetos basados ​​en datos de entrada.

 

#Uso en pruebas automatizadas

 

El helper with() es excelente para crear datos de prueba:

 

public function testUserRegistration()
{
    $userData = with([], function ($data) {
        $data['name'] = 'Test User';
        $data['email'] = 'test@example.com';
        $data['password'] = 'password';
        $data['password_confirmation'] = 'password';
        return $data;
    });

    $response = $this->post('/register', $userData);

    $response->assertRedirect('/home');
    $this->assertDatabaseHas('users', ['email' => 'test@example.com']);
}

 

Este enfoque mantiene su configuración de prueba limpia y legible.

 

#Ejemplo práctico: Configuración de un cliente API de terceros

 

A continuación se muestra cómo puede utilizar with() para configurar un cliente API complejo:

 

use ThirdParty\ApiClient;

$client = with(new ApiClient, function ($client) use ($config) {
    $client->setApiKey($config['api_key'])
           ->setBaseUrl($config['base_url'])
           ->setVersion($config['version'])
           ->setRetryPolicy([
               'times' => 3,
               'sleep' => 1000,
           ])
           ->setLogger(app('log'))
           ->setCache(app('cache')->store('redis'));
    
    if ($config['debug']) {
        $client->enableDebugging();
    }
    
    return $client;
});

 

Este ejemplo demuestra cómo with() puede hacer que la configuración de objetos complejos sea más legible y fácil de mantener.

 

#Consideraciones sobre el rendimiento

 

Si bien with() es conveniente, es importante tener en cuenta que no ofrece ningún beneficio de rendimiento en comparación con la creación y modificación de objetos tradicionales. Su principal ventaja es la legibilidad y la organización del código.

 

El helper with() en Laravel es una herramienta versátil que puede mejorar significativamente la legibilidad y la organización de su código, especialmente cuando se trata de la configuración o modificación de objetos complejos. Al permitirle crear y configurar objetos en una única operación fluida, promueve un código más limpio y expresivo. Ya sea que esté configurando datos de prueba, configurando objetos complejos o simplificando sus factories, el helper with() es una valiosa aportación a su conjunto de herramientas de Laravel.

Antonio Jenaro

Antonio Jenaro

Web Developer

Archivado en:

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