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:
- Instala wkhtmltopdf, de preferencia en la ruta
C:\wkhtmltopdf
- Abre el archivo
.env
y busca la llaveWKHTML_PDF_BINARY
. Pon la ruta completa del ejecutable de wkhtmltopdf (si instalaste enC:\wkhtmltopdf
, sólo debes descomentar esa línea, de lo contrario, ya sabes qué hacer: Escribirla completa)
Recursos utilizados:
- Patrones de Diseño, Blog de Herminio Heredia
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