Laravel pasa un cierto parámetro a todas las rutas en todas las vistas

Necesitaba pasar un nombre de subdominio a todas las vistas para que cuando generan rutas con route('namedRoute') los usuarios terminarán en el mismo subdominio.

Terminé creando un ViewServiceProvider que registra un Ver compositor donde obtengo el subdominio de la solicitud así:

    use Illuminate\Support\Facades\View as FView;
    use Illuminate\View\View;

    class ViewServiceProvider extends ServiceProvider {
         FView::composer('*', function(View $view){
             $view->with('subdomain', request()->route()->subdomain);
         });
    }

De esta manera la variable subdominio se pasará a cada vista de singe cada vez gracias a la '*' como se documenta en Laravel docs.

Entonces cuando necesite generar cualquier ruta en cualquier vista, siempre tendré que pasar el subdominio así y la ruta se generará correctamente.

    {{ route('signInPage', ['subdomain' => $subdomain]) }}

Así que hay algo en Laravel (como post view processing) que puedo conectar para poblar el subdominio automáticamente así que no tengo que modificar ahora cada generación de ruta en cada vista?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por algorithmadeptc6cb


3 Respuestas:

  • El generador de URL puede tomar predeterminados para que no tenga que pasar un parámetro para la ruta al generar la URL:

    URL::defaults(['subdomain' => ....]);
    

    Puedes crear un middleware de ruta que consiga el subdomain parámetro de la solicitud y establece este predeterminado.

    Laravel 8.x Docs - URLs - Valores predeterminados

    Respondida el Dec 17, 2020 a las 02:06 - por phpphoenix

    Votos positivos: 0 | Votos negativos: 0

  • Si deseas automatizar la inclusión del subdominio en todas las rutas generadas en tus vistas sin tener que añadir manualmente el parámetro en cada llamada a route(), podrías considerar utilizar un Middleware en Laravel.

    Aquí te dejo un ejemplo de cómo podrías lograrlo:

    • Crea un Middleware que agregue el subdominio a todas las solicitudes entrantes. Puedes ejecutar el siguiente comando para crear un nuevo middleware:
    bash
    php artisan make:middleware AddSubdomainToRoute
    
    • Abre el archivo generado en `app/Http/Middleware/AddSubdomainToRoute.php` y realiza la siguiente modificación:
    php
    namespace App\Http\Middleware;
    
    use Closure;
    
    class AddSubdomainToRoute
    {
        public function handle($request, Closure $next)
        {
            $subdomain = $request->route()->subdomain;
    
            view()->share('subdomain', $subdomain);
    
            return $next($request);
        }
    }
    
    • Registra el middleware en el archivo `app/Http/Kernel.php`. Agrega la siguiente línea en la propiedad `$middleware` o `$middlewareGroups` según tus necesidades:
    php
    protected $middleware = [
        // Otros middlewares
        \App\Http\Middleware\AddSubdomainToRoute::class,
    ];
    

    Con esto, el subdominio estará disponible automáticamente en todas las vistas sin necesidad de pasar explícitamente el parámetro en cada llamada a route().

    Espero que esta solución te sea de ayuda. Si tienes alguna otra pregunta o duda, ¡estaré encantado de ayudarte!

    Respondida el Dec 18, 2020 a las 02:03 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Existen varias formas de lograr lo que deseas en Laravel:

    1. Macros de rutas:

    Puedes crear macros de rutas para incluir automáticamente el parámetro subdomain en todas las rutas nombradas. Agrega lo siguiente a tu archivo app/Providers/RouteServiceProvider.php:

    php
    use Illuminate\Support\Facades\Route;
    
    public function boot()
    {
        parent::boot();
    
        Route::macro('signed', function ($name, $parameters = []) {
            $parameters['subdomain'] = request()->route()->subdomain;
    
            return $this->{$name}($parameters);
        });
    }
    

    Ahora puedes usar el método signed en tus rutas nombradas:

    php
    Route::signed('signInPage');
    

    Esto generará una ruta con el parámetro subdomain.

    2. Middleware:

    Puedes crear un middleware para añadir el parámetro subdomain a cada solicitud antes de que llegue a las rutas. Agrega lo siguiente a tu archivo app/Http/Middleware/AddSubdomainToRequest.php:

    php
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class AddSubdomainToRequest
    {
        public function handle(Request $request, Closure $next)
        {
            $request->merge(['subdomain' => $request->route()->subdomain]);
    
            return $next($request);
        }
    }
    

    Luego registra el middleware en el archivo app/Http/Kernel.php:

    php
    protected $middleware = [
        // ... otros middlewares
        \App\Http\Middleware\AddSubdomainToRequest::class,
    ];
    

    Esto añadirá automáticamente el parámetro subdomain a todas las solicitudes.

    3. Mutator de modelo:

    Si estás utilizando un modelo para representar tus subdominios, puedes crear un mutador para añadir el subdominio al modelo. Agrega lo siguiente a tu modelo:

    php
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Subdomain extends Model
    {
        protected $appends = ['subdomain'];
    
        public function getSubdomainAttribute()
        {
            return request()->route()->subdomain;
        }
    }
    

    Esto añadirá el parámetro subdomain al modelo Subdomain y podrás acceder a él en tus vistas.

    Ten en cuenta que la primera opción es la más adecuada si solo necesitas incluir el parámetro subdomain en las rutas nombradas. La segunda opción es más general y añadirá el parámetro a todas las solicitudes. La tercera opción es específica para modelos de subdominio. Elige la mejor opción según tus necesidades específicas.

    Respondida el Dec 18, 2020 a las 02:12 - por Gemini

    Votos positivos: 0 | Votos negativos: 0