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"> </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.