Laravel – Views – Parte 1

O Laravel utiliza o simples, mas poderoso Blade como “engine” de templates, que nos provê uma série de facilidades, que aprenderemos pouco a pouco.

Os arquivos de “views” (telas) do Blade usam a extensão “.blade.php” e normalmente são armazenados no diretório “resources/views”.

Para maiores detalhes e documentação oficial, acesse https://laravel.com/docs/5.4/blade.

Bem, o objetivo deste artigo é começarmos a aprender como criar uma estrutura padrão para nossas telas, que proporcione uma apresentação profissional e maximize a reutilização de código.

Vamos primeiro definir as seções (estrutura) de nossa view padrão, e para tal nos basear na view “app.blade.php“:

Notem que a view “app.blade.php” foi criada automaticamente, pasta “resources/views/layouts” quando criamos nosso modelo de autenticação de usuários (“php artisan make:auth“), já que as views de controle de usuários (login, register, …) se “estendem”, por padrão do Laravel, de “app.blade.php“.

<!DOCTYPE html>
<html lang="{{ config('app.locale') }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">

    <!-- Scripts -->
    <script>
        window.Laravel = {!! json_encode([
            'csrfToken' => csrf_token(),
        ]) !!};
    </script>
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-default navbar-static-top">
            <div class="container">
                <div class="navbar-header">

                    <!-- Collapsed Hamburger -->
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
                        <span class="sr-only">Toggle Navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>

                    <!-- Branding Image -->
                    <a class="navbar-brand" href="{{ url('/') }}">
                        {{ config('app.name', 'Laravel') }}
                    </a>
                </div>

                <div class="collapse navbar-collapse" id="app-navbar-collapse">
                    <!-- Left Side Of Navbar -->
                    <ul class="nav navbar-nav">
                        &nbsp;
                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="nav navbar-nav navbar-right">
                        <!-- Authentication Links -->
                        @if (Auth::guest())
                            <li><a href="{{ route('login') }}">Login</a></li>
                            <li><a href="{{ route('register') }}">Register</a></li>
                        @else
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
                                    {{ Auth::user()->name }} <span class="caret"></span>
                                </a>

                                <ul class="dropdown-menu" role="menu">
                                    <li>
                                        <a href="{{ route('logout') }}"
                                            onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                            Logout
                                        </a>

                                        <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
                                            {{ csrf_field() }}
                                        </form>
                                    </li>
                                </ul>
                            </li>
                        @endif
                    </ul>
                </div>
            </div>
        </nav>

        @yield('content')
    </div>
    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}"></script>
</body>
</html>

Observação: O Laravel 5.4 já vem com Bootstrap e Jquery inclusos.

Com base no código acima vamos separar as seções que utilizaremos, “desmembrando” a view original em views menores e mais específicas:

<!DOCTYPE html>

<html lang="{{ config('app.locale') }}">

<head>

   <!--
      META TAGS
   -->
   
   <!-- FAVICON -->
   <link rel="icon" href="../../favicon.ico">

   <title> TITULO </title>
   
   <!--
      CSS / Fonts / Styles
   -->

   <!--
      scripts
   -->
    	
</head>

<body>

   <nav> MENU/BARRA DE NAVEGAÇÃO </nav>

   <div> 
      CONTEUDO
      RODAPE
   </div>

   <!--
      scripts
   -->

</body>

</html>

Neste ponto devemos entender que a estrutura acima representa uma simplificação de uma view padrão para o Laravel, neste caso uma simplificação de “app.blade.php“.

Começaremos criando nossas views padrões a partir da estrutura principal, que em seu conjunto nos fornecerão o layout padrão para nossa aplicação.

Vamos modificar o arquivo “app.blade.php” na pasta “resources/views/layouts”:

<!DOCTYPE html>

<html lang="{{ config('app.locale') }}">

<head>

   @include('layouts.meta')
   
   @yield('title')

   @include('layouts.css')

   @yield('css')

</head>

<body role="document">

   <div id="app"> <!-- /container -->

       @include('layouts.nav')

       <div class="container theme-showcase" role="main">

          @yield('content')

          @include('layouts.bottom')

       </div>

   </div> <!-- /container -->

   @include('layouts.scripts')

   @yield('scripts')

</body>

</html>

Antes de continuarmos, vamos ver a diferença entre @include e @yield:

@include: É semelhante a função include() do php, neste contexto, por exemplo, o comando “@include(‘layouts.css’) fará o include do arquivo “resources/views/layouts/meta.blade.php” no arquivo “resources/views/layouts/master.blade.php

@yield: É usado para injetar conteúdo em uma página-filha que você definiu como parâmetro na página-mãe, por exemplo, “@yield(‘css’)” espera receber o conteúdo de uma variável chamada “css” definida na página-mãe.

Este conceito ficará mais claro ao estudarmos os demais arquivos que criaremos nos próximos posts.

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.