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.

Laravel 8: ¿Cómo compartir una variable PHP con diferentes páginas (usando el mismo diseño) y componentes?

Estoy trabajando en esta aplicación web (Laravel 8) en la cual los usuarios pueden elegir sus temas de color. Básicamente, para simplificar, digamos que cada usuario puede elegir su color primario.

En la página de inicio (que no requiere autenticación), el color primario vendrá de la configuración (si el usuario está autenticado o no). En las páginas autenticadas, el color primario proviene de la tabla de usuarios (para el usuario autenticado). También tengo varias páginas que utilizan el diseño de invitado si el usuario no está autenticado, y el diseño de la aplicación si el usuario está autenticado. Esas páginas utilizarían el color primario de la configuración si el usuario no está autenticado, y el color primario elegido por el usuario si están autenticados.

Todas esas páginas utilizan algunos componentes (botones, enlaces de navegación, etc.) que necesitan conocer el color primario.

Actualmente tengo esta línea al principio de CADA archivo php que necesita conocer el color primario:

$primary_color = (Auth::user() && Route::current()->getName() !== 'home') ? Auth::user()->config->color_theme : "yellow";

(El color “amarillo” está codificado aquí, solo ignóralo).

Me encantaría evitar tanta replicación de código, pero no puedo encontrar una forma de compartir esta variable desde el diseño (guest.blade.php o app.blade.php) hacia la página. Tampoco puedo incluir una vista style.blade.php que contenga la variable. Las variables declaradas en esta vista incluida no existen en el resto de la página. Logré pasar la variable a los componentes usando una propiedad. No es muy elegante, pero funciona bien. Pero preferiría utilizar una solución más limpia.

Pero lo más importante, ¿cómo puedo evitar tener que copiar el mismo fragmento de código al principio de cada página?

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para Compartir una Variable del Layout a las Páginas en Laravel 8

    Como experto en IT especializado en Laravel, variables, layout y slots, sugiero la siguiente solución para evitar copiar el mismo código en la parte superior de cada página y para compartir la variable primary_color desde el layout a las páginas:

    1. Definir un valor predeterminado para primary_color en el archivo config/app.php, que puede ser modificada por los usuarios en la tabla de usuarios.
    'primary_color' => 'amarillo', // valor predeterminado
    
    1. Crear una función helper en el archivo app/Helpers/helpers.php que recupere el valor de primary_color según el estado de autenticación del usuario actual y el nombre de la página.
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Route;
    
    function getPrimaryColor() {
        return (Auth::check() && Route::current()->getName() !== 'home')
            ? Auth::user()->config->color_theme
            : config('app.primary_color');
    }
    
    1. Incluir el archivo helpers.php en el archivo composer.json, para que su cargador automático pueda ser cargado.
    "autoload": {
        "files": [
            "app/Helpers/helpers.php"
        ],
        ...
    },
    
    1. Ejecutar el comando composer dump-autoload para refrescar el cargador automático.
    composer dump-autoload
    
    1. Utilizar la función helper en el layout (guest.blade.php o app.blade.php) para definir la variable primary_color, que puede ser accedida en las páginas y componentes.
    @php($primary_color = getPrimaryColor())
    
    1. Utilizar la directiva @component para definir un componente reutilizable que pueda ser utilizado en las páginas.
    @component('components.color-component', ['primary_color' => $primary_color])
    @endcomponent
    
    1. Definir el archivo blade color-component.blade.php que utilice el valor de primary_color para definir los estilos de color de los componentes.
    <button style="background-color: {{ $primary_color }};">Botón</button>
    <a href="#" style="color: {{ $primary_color }};">Enlace</a>
    

    Con esta solución, puedes evitar copiar el mismo fragmento de código en la parte superior de cada archivo PHP y tener una forma más limpia de compartir variables desde el layout a las páginas.

Comments are closed.