DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on

1

Laravel Router 2

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:

RateLimiter::for('dos', function(Request $request){
  return Limit::perMinute(2);
});
Enter fullscreen mode Exit fullscreen mode

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:

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

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

Route::get('/tres', function(){
    return view('welcome');
})->middleware('throttle:tres');
Enter fullscreen mode Exit fullscreen mode

Este es el resultado:

Alt Text

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}

Route::get('/{user}', function(App\Models\User $user) {
    return $user;
});
Enter fullscreen mode Exit fullscreen mode

También podemos hacerlo con los controladores:

en las rutas:

Route::get('/pruebacontroller/{user}', [App\Http\Controllers\PruebaController::class, 'getUser']);
Enter fullscreen mode Exit fullscreen mode

en el controlador:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

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

Enter fullscreen mode Exit fullscreen mode

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:


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);
    }
Enter fullscreen mode Exit fullscreen mode

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

Route::get('/prueba/{user}', [App\Http\Controllers\PruebaController::class, 'getUsuario']);
Enter fullscreen mode Exit fullscreen mode

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

<?php

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

class PruebaController extends Controller
{
    public function getUsuario(User $user){
        return $user;
    }
}
Enter fullscreen mode Exit fullscreen mode

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

Alt Text

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Retry later