Skip to content

sebacarrasco93/patrones-laravel

Repository files navigation

Patrones de Diseño con Laravel

Esta es una recopilación de diferentes Patrones de Diseño que se pueden utilizar con el Framework Laravel.

Testeado en Laravel 8 y PHP 8, pero puede servir en futuras versiones (y también anteriores).

Importante, antes de usar:

Si quieres probar manualmente el patrón Adapter (que usa APIs externas para verificar si un email es válido) debes crear una cuenta en ambos proveedores.

A continuación, debes generar tokens y copiarlos en el .env:

API_KEY_APILAYER=#{Tu token acá}
API_KEY_ABSTRACTAPI=#{Tu token acá}

Si usas Windows:

  1. Instala wkhtmltopdf, de preferencia en la ruta C:\wkhtmltopdf
  2. Abre el archivo .env y busca la llave WKHTML_PDF_BINARY. Pon la ruta completa del ejecutable de wkhtmltopdf (si instalaste en C:\wkhtmltopdf, sólo debes descomentar esa línea, de lo contrario, ya sabes qué hacer: Escribirla completa)

Recursos utilizados:

Patrones disponibles:

Testing

php artisan test # --parallel

Contribuir

Crea un Pull Request con los cambios.

Para agregar un patrón nuevo y mantener la misma consistencia de datos, debes seguir lo siguiente:


Actualización: Usa este comando para crear el Test y Controller automáticamente:

php artisan patrones:nuevo (nuevo-patron)

Si quieres hacer todo a mano, debes escribir:

php artisan make:test NombrePatronTest

tests/Feature/NombrePatronTest.php

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class NombrePatronTest extends TestCase
{
    use RefreshDatabase;

    /** @test */
    function puede_descargar_un_reporte_de_usuarios_usando_dompdf_con_nombre_del_patron()
    {
        $users = User::factory(5)->create();

        $response = $this->post(route('nombrePatron', 'dompdf'));

        $response->assertOk();

        $contentType = $response->headers->get('content-type');
        $contentDisposition = $response->headers->get('content-disposition');

        $this->assertEquals('application/pdf', $contentType);
        $this->assertEquals('attachment; filename="users_report_nombre_patron.pdf"', $contentDisposition);
    }

    /** @test */
    function puede_descargar_un_reporte_de_usuarios_usando_snappy_con_nombre_del_patron()
    {
        $users = User::factory(5)->create();

        $response = $this->post(route('nombrePatron', 'snappy'));

        $response->assertOk();

        $contentType = $response->headers->get('content-type');
        $contentDisposition = $response->headers->get('content-disposition');

        $this->assertEquals('application/pdf', $contentType);
        $this->assertEquals('attachment; filename="users_report_nombre_patron.pdf"', $contentDisposition);
    }

    /** @test */
    function no_puede_descargar_un_reporte_de_usuarios_usando_un_parametro_invalido_con_nombre_del_patron()
    {
        $user = User::factory(5)->create();

        $response = $this->post(route('nombrePatron', 'invalido'));

        $response->assertStatus(500);
    }
}

Crear controller:

php artisan make:controller NombrePatronController

app/Http/Controllers/NombrePatronController.php

public function __invoke(Request $request)
{
    // ...
}

resources/views/index.blade.php

@section('contenido')
    <!-- Después del último... -->
    <a href="{{ route('patrones.nombrePatron') }}">Nombre Patrón</a>
@endsection

resources/views/patrones/nombre-patron.blade.php

@extends('layout')
@section('titulo', 'Nombre Patrón')

@section('contenido')
<form action="{{ route('nombrePatron', 'dompdf') }}" method="POST">
    <h2>Descargar con Dompdf</h2>
    @csrf
    <button>Descargar</button>
</form>

<form action="{{ route('nombrePatron', 'snappy') }}" method="POST">
    <h2>Descargar con Snappy</h2>
    @csrf
    <button>Descargar</button>
</form>
@endsection

routes/web.php

use App\Http\Controllers\NombrePatronController;

// Abajo del último con métodos GET
Route::get('nombre-patron', [PatronesController::class, 'nombrePatron'])->name('patrones.nombrePatron');

// Abajo del último con métodos POST
Route::post('nombre-patron/{report}', NombrePatronController::class)->name('nombrePatron');

README.md

## Patrones disponibles:

- [x] Nombre Patrón

About

Patrones de Diseño con Laravel

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published