3. Creando Cabecera y Menú

 Creando una Estructura de Plantillas en Laravel

Basado en la estructura de archivos mostrada en la imagen, voy a explicar cómo crear un sistema de plantillas en Laravel con una plantilla principal, páginas de ingreso, selección, cabecera y menú.

Estructura de Archivos

La imagen muestra una estructura típica de Laravel con:

  • Controladores (HomeController.phpInicioController.php)

  • Modelos (User.phpInicio.php)

  • Vistas en la carpeta views con varios módulos

Plantilla Principal (plantilla.blade.php)

La plantilla principal sirve como base para todas las demás vistas. Aquí está el código mejorado:

php
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@yield('title') - Mi Aplicación</title>
    <!-- Google Font -->
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600">
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="{{ asset('css/bootstrap.min.css') }}">
    <!-- Estilos personalizados -->
    <link rel="stylesheet" href="{{ asset('css/app.css') }}">
</head>
<body class="hold-transition skin-blue">
    <div class="wrapper">
        @if(Auth::user())
            @include('modules.cabecera')
        @endif
        
        <div class="content-wrapper">
            @yield('content')
        </div>
    </div>

    <!-- jQuery 3 -->
    <script src="{{ asset('js/jquery.min.js') }}"></script>
    <!-- Bootstrap JS -->
    <script src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>
    <!-- Scripts personalizados -->
    <script src="{{ asset('js/app.js') }}"></script>
    @yield('scripts')
</body>
</html>

Cabecera y Menú (cabecera.blade.php)

La cabecera incluirá el menú principal de la aplicación:

php
<header class="main-header">
    <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
        <div class="container">
            <a class="navbar-brand" href="{{ route('inicio') }}">Mi Aplicación</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav ml-auto">
                    @auth
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('inicio') }}">Inicio</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('seleccionar') }}">Seleccionar</a>
                        </li>
                        <li class="nav-item">
                            <form method="POST" action="{{ route('logout') }}">
                                @csrf
                                <button type="submit" class="btn btn-link nav-link">Cerrar Sesión</button>
                            </form>
                        </li>
                    @endauth
                </ul>
            </div>
        </div>
    </nav>
</header>

Vista de Ingreso (Ingresar.blade.php)

Página de login para usuarios no autenticados:

php
@extends('plantilla')

@section('title', 'Ingresar')

@section('content')
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-6">
            <div class="card">
                <div class="card-header">{{ __('Ingresar') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('login') }}">
                        @csrf

                        <div class="form-group">
                            <label for="email">{{ __('Correo Electrónico') }}</label>
                            <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" required autocomplete="email" autofocus>
                            @error('email')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                            @enderror
                        </div>

                        <div class="form-group">
                            <label for="password">{{ __('Contraseña') }}</label>
                            <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
                            @error('password')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                            @enderror
                        </div>

                        <div class="form-group">
                            <button type="submit" class="btn btn-primary btn-block">
                                {{ __('Ingresar') }}
                            </button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Vista de Selección (Seleccionar.blade.php)

Página para seleccionar opciones después del login:

php
@extends('plantilla')

@section('title', 'Seleccionar')

@section('content')
<div class="container py-4">
    <h2 class="text-center mb-4">Seleccione una opción</h2>
    
    <div class="row">
        <div class="col-md-4 mb-4">
            <div class="card h-100">
                <div class="card-body text-center">
                    <h5 class="card-title">Opción 1</h5>
                    <p class="card-text">Descripción de la opción 1</p>
                    <a href="#" class="btn btn-primary">Seleccionar</a>
                </div>
            </div>
        </div>
        
        <div class="col-md-4 mb-4">
            <div class="card h-100">
                <div class="card-body text-center">
                    <h5 class="card-title">Opción 2</h5>
                    <p class="card-text">Descripción de la opción 2</p>
                    <a href="#" class="btn btn-primary">Seleccionar</a>
                </div>
            </div>
        </div>
        
        <div class="col-md-4 mb-4">
            <div class="card h-100">
                <div class="card-body text-center">
                    <h5 class="card-title">Opción 3</h5>
                    <p class="card-text">Descripción de la opción 3</p>
                    <a href="#" class="btn btn-primary">Seleccionar</a>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Vista de Inicio (Inicio.blade.php)

Página principal después del login:

php
@extends('plantilla')

@section('title', 'Inicio')

@section('content')
<div class="container py-4">
    <h1 class="text-center mb-4">Bienvenido, {{ Auth::user()->name }}</h1>
    
    <div class="row">
        <div class="col-md-8 mx-auto">
            <div class="card">
                <div class="card-body">
                    <h5 class="card-title">Resumen de Actividad</h5>
                    <p class="card-text">Contenido principal de la página de inicio.</p>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Configuración de Rutas

En tu archivo routes/web.php, asegúrate de tener las rutas necesarias:

php
Route::get('/', function () {
    return view('Ingresar');
})->name('ingresar');

Route::get('/inicio', [InicioController::class, 'index'])->name('inicio')->middleware('auth');
Route::get('/seleccionar', [InicioController::class, 'seleccionar'])->name('seleccionar')->middleware('auth');

Auth::routes();

Consideraciones Finales

  1. La plantilla principal (plantilla.blade.php) sirve como base para todas las demás vistas.

  2. La cabecera (cabecera.blade.php) se muestra solo cuando el usuario está autenticado.

  3. Las vistas de ingreso, selección e inicio extienden la plantilla principal.

  4. Se utiliza Bootstrap para el diseño responsive.

  5. Las rutas protegidas con el middleware 'auth' solo son accesibles para usuarios autenticados.

Esta estructura proporciona una base sólida para construir una aplicación Laravel con autenticación y un sistema de plantillas organizado

Comentarios

Entradas más populares de este blog

8-Creación de una API RESTful con Laravel

02 -Rutas en Laravel

3-Rutas