Laravel Router 2
Tags: laravel, php, spanish
Published: 2021-03-23 21:42:48


### Limitar la cantidad de peticiones hacia una ruta, o rate limits:

Primero nos dirigimos a RouteSerViceProvider.php y buscamos el método configureRateLimiting()

Y adentro de el vamos a definir nuestro middleware:

```php
RateLimiter::for('dos', function(Request $request){
  return Limit::perMinute(2);
});
```

Lo que hacemos es llamar a la clase RateLimiter y con el método for le especificamos el nombre del middleware, a continuación creamos una función anónima y dentro de ella limitamos la cantidad de peticiones con la clase Limit, esta contiene varios métodos estáticos para limitar la cantidad de peticiones, la mas usada es perMinute. También podemos generar nuestro propio mensaje para cuando se superen la cantidad de peticiones configuradas:

```php
RateLimiter::for('tres', function(Request $request){
  return Limit::perMinute(3)->response(function(){
    return response('Excedió la cantidad de consultas', 429);
   });
});
```

Ahora solo tenemos que ir a nuestras rutas y pasar como middleware nuestra configuración de esta manera:

```php
Route::get('/tres', function(){
    return view('welcome');
})->middleware('throttle:tres');
```

Este es el resultado:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ux9kkl55nrmwrlotd08y.png)
### Route Model Binding

Route Model Binding es una forma de vincular el modelo con una o varias rutas y que estas puedan hacer consultas de manera automática. Anteriormente cuando queríamos enviar datos desde el modelo hacia la vista teníamos que llamar al modelo desde el controlador y retornarlo ahí mismo.

Pero con esta forma de hacerlo vamos a ahorrarnos mucho código, además hay dos formas de hacerlo:

Forma explícita:

Es básicamente guardar el modelo en una variable en la función anónima que le pasamos a la ruta, como dato importante; para que esto funcione al parámetro de la ruta le tenemos que poner el mismo nombre que la variable donde guardamos el modelo, es decir que sin en la función anónima al modelo lo guardamos en la variable $user, el parámetro que va a recibir la ruta es {user}

```php 
Route::get('/{user}', function(App\Models\User $user) {
    return $user;
});
```

También podemos hacerlo con los controladores:

en las rutas: 

```php
Route::get('/pruebacontroller/{user}', [App\Http\Controllers\PruebaController::class, 'getUser']);
```

en el controlador:

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PruebaController extends Controller
{
    public function getUser(\App\Models\User $user){
        return $user;
    }
}

```


Forma implícita:

La forma implícita es usar la clase RouteServiceProvider y en el método boot() indicarle que a la clase Route le vamos a pasar un modelo, de esta manera:

```php

public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });

        Route::model('user', User::class);
    }
```

Ahora en la ruta especificamos el controlador que va a retornarnos los datos y el método correspondiente:

```php
Route::get('/prueba/{user}', [App\Http\Controllers\PruebaController::class, 'getUsuario']);
```

Y en nuestro controlador usamos el namespace del modelo User y se lo pasamos al método para poder retornar los datos

```php
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use \App\Models\User;

class PruebaController extends Controller
{
    public function getUsuario(User $user){
        return $user;
    }
}
```

Esto no s va a dar como resultado el usuario con su id correspondiente

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/biws42squeydtbw4qc14.png)