es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agregar un parámetro predeterminado para todas las rutas en Laravel.

Tengo un sitio web multilingüe donde quiero agregar la configuración regional actual como prefijo para todas las rutas de mi proyecto. Para esto, siempre debo proporcionar un valor para el parámetro de localización de la ruta cada vez que la use. Creo que hay mejores formas de hacer esto.

Mis rutas se ven así:

Route::prefix(‘{locale}’)->group(function() {
Route::get(‘/’, [App\Http\Controllers\HomeController::class, ‘index’])->name(‘home’);
Route::get(‘/blog’, [App\Http\Controllers\PostController::class, ‘index’])->name(‘blog’);
});

Quiero que mi ruta en la URL se vea así:
– http://localhost/project/en/blog o
– http://localhost/project/fa/blog

También tengo un middleware llamado SetLocale donde decido la configuración regional de la aplicación según la ruta de la solicitud que se recibe;

Aquí está el código de mi middleware:

class SetLocale
{
public function handle(Request $request, Closure $next)
{

    $locale = $request->segment(1);
    if (! is_null($locale) && ! in_array($locale, config('app.locales')) ) // config('app.locales') = ['en', 'ar', 'fa']
        abort(404);

    $html_dir = in_array($locale, ['en'])?'ltr':'rtl';
    \Illuminate\Support\Facades\Config::set('app.html_dir', $html_dir);
    \Illuminate\Support\Facades\App::setLocale($locale);

    return $next($request);
}

}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es modificar el middleware SetLocale para establecer la configuración regional antes de agregar el prefijo a las rutas. De esta manera, el parámetro de la configuración regional ya no será necesario en la definición de la ruta.

    Aquí tienes un ejemplo de código:

    class SetLocale
    {
        public function handle(Request $request, Closure $next)
        {
            $locale = $request->segment(1);
            if (!is_null($locale) && !in_array($locale, config('app.locales'))) {
                abort(404);
            }
            \Illuminate\Support\Facades\App::setLocale($locale);
            $html_dir = in_array($locale, ['en']) ? 'ltr' : 'rtl';
            \Illuminate\Support\Facades\Config::set('app.html_dir', $html_dir);
    
            $request->route()->forgetParameter('locale');
            return $next($request);
        }
    }
    

    Con este código, el middleware establece la configuración regional de la aplicación según el primer segmento de la URL. Luego, elimina el parámetro “locale” de la ruta actual para evitar la necesidad de especificarlo en la definición de la ruta. Finalmente, pasa la solicitud modificada al siguiente middleware.

    Aquí tienes un ejemplo de cómo se verían las rutas modificadas:

    Route::middleware(['setLocale'])->group(function() {
        Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
        Route::get('/blog', [App\Http\Controllers\PostController::class, 'index'])->name('blog');
    });
    

    Con este código, la configuración regional actual se añadirá automáticamente como prefijo a todas las rutas, basándose en la configuración regional de la aplicación establecida por el middleware. Por ejemplo, si la configuración regional de la aplicación está establecida en “en”, las URLs serían:

    Y si la configuración regional de la aplicación está establecida en “fa”, las URLs serían:

Comments are closed.