2-2-Controller
@Controller('products')
export class ProductsController { constructor(private readonly productsService: ProductsService) {} @Get() @UseGuards(AuthGuard) findAll(): Product[] { return this.productsService.findAll(); } @Post() @UsePipes(ValidationPipe) create(@Body() createProductDto: CreateProductDto) { return this.productsService.create(createProductDto); } }¡Claro! Vamos a desglosar el código línea por línea para entender cómo funcionan los decoradores en NestJS y cómo estructuran la lógica de un controlador.
1. @Controller('products')
@Controller('products')Función: Define que esta clase es un controlador de NestJS y establece la ruta base
/productspara todas las rutas dentro de él.Equivalente en Laravel: Sería como definir un grupo de rutas en
routes/api.php:Route::prefix('products')->group(function () { ... });¿Por qué va antes de la clase?
Porque NestJS usa decoradores para configurar metadatos que luego el framework interpreta. Aquí le dice: "Esta clase manejará todas las solicitudes bajo la ruta/products".
2. export class ProductsController
export class ProductsController { ... }Función: Define la clase del controlador (similar a un
Controlleren Laravel).Export: Se usa
exportpara que NestJS pueda inyectar esta clase en otros lugares (como en los módulos).
3. constructor(private readonly productsService: ProductsService)
constructor(private readonly productsService: ProductsService) {}Función: Inyecta el servicio
ProductsServiceen el controlador (Dependency Injection).Equivalente en Laravel: Sería como inyectar un
Serviceen el constructor de un controlador:public function __construct(private ProductService $productService) {}private readonly:private: Solo accesible dentro de la clase.readonly: No se puede reasignar después de la inyección.
4. @Get()
@Get()Función: Define que este método manejará solicitudes HTTP GET en la ruta base (
/products).Equivalente en Laravel:
Route::get('/', [ProductController::class, 'findAll']);¿Por qué va antes del método?
Porque le dice a NestJS: "Cuando alguien haga unGET /products, ejecuta este método".
5. @UseGuards(AuthGuard)
@UseGuards(AuthGuard)Función: Aplica un guardia (similar a un middleware de autenticación en Laravel) para proteger la ruta.
Equivalente en Laravel:
Route::get('/', [ProductController::class, 'findAll'])->middleware('auth');¿Qué hace?
Verifica si el usuario está autenticado antes de ejecutarfindAll().
6. findAll(): Product[]
findAll(): Product[] {
return this.productsService.findAll();
}Función: Método que devuelve todos los productos (usando el servicio inyectado).
Equivalente en Laravel:
public function findAll() { return $this->productService->all(); }
7. @Post()
@Post()Función: Define que este método manejará solicitudes HTTP POST en
/products.Equivalente en Laravel:
Route::post('/', [ProductController::class, 'create']);
8. @UsePipes(ValidationPipe)
@UsePipes(ValidationPipe)Función: Aplica un pipe de validación (similar a un
Form Requesten Laravel).Equivalente en Laravel:
public function store(StoreProductRequest $request) { ... }¿Qué hace?
Valida que los datos enviados en elPOSTcumplan con las reglas definidas enCreateProductDto.
9. create(@Body() createProductDto: CreateProductDto)
create(@Body() createProductDto: CreateProductDto) {
return this.productsService.create(createProductDto);
}@Body(): Extrae los datos del cuerpo (body) de la solicitud HTTP (similar a$request->all()en Laravel).CreateProductDto: Es un objeto que define la estructura y validación de los datos (como unForm Requesten Laravel).Equivalente en Laravel:
public function create(Request $request) { $validated = $request->validate([ ... ]); return $this->productService->create($validated); }
Resumen de flujo
@Controller('products')→ Define la ruta base (/products).@Get()→ ManejaGET /products.@UseGuards(AuthGuard)→ Protege la ruta.findAll()→ Llama al servicio para obtener los productos.@Post()→ ManejaPOST /products.@UsePipes(ValidationPipe)→ Valida los datos.@Body() createProductDto→ Extrae y valida el cuerpo de la solicitud.create()→ Llama al servicio para crear un producto.
¿Por qué los decoradores van antes?
NestJS usa metadatos: Los decoradores agregan información que el framework usa para enrutar, validar y proteger las solicitudes.
Similar a anotaciones en otros lenguajes: Como las anotaciones
@en Java Spring o los atributos#[...]en PHP 8+.Laravel lo hace en archivos separados: En Laravel, esto se configura en
routes/web.phpo con middlewares, mientras que NestJS lo hace directamente en el controlador.
Ejemplo completo comparado con Laravel
| NestJS (Decoradores) | Laravel (Alternativa) |
|---|---|
@Controller('products') | Route::prefix('products') |
@Get() | Route::get('/', ...) |
@UseGuards(AuthGuard) | ->middleware('auth') |
@Post() | Route::post('/', ...) |
@UsePipes(ValidationPipe) | StoreProductRequest |
@Body() | $request->all() |
Los decoradores hacen que todo esté autodocumentado y centralizado en el controlador, mientras que en Laravel esta configuración está más distribuida
Comentarios
Publicar un comentario