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

This site uses Akismet to reduce spam. Learn how your comment data is processed.