O livro "Laravel. Guia completo. 2ª edição

imagemOlá, habrozhiteli! O que diferencia o Laravel de outros frameworks PHP? Velocidade e simplicidade. O rápido desenvolvimento de aplicativos, um extenso ecossistema e o kit de ferramentas Laravel permitem criar rapidamente sites e aplicativos com código limpo e legível.

Matt Staffer, um renomado professor e desenvolvedor líder, oferece uma visão geral da estrutura e exemplos específicos de como trabalhar com ela. O livro ajudará desenvolvedores experientes de PHP a inserir rapidamente um novo tópico para implementar um projeto no Laravel. A publicação também aborda os tópicos do Laravel Dusk e Horizon, coleta informações sobre recursos da comunidade e outros pacotes que não fazem parte do núcleo do Laravel. Neste livro, você encontrará: • Ferramentas para coletar, verificar, normalizar e filtrar dados do usuário • Blade, um poderoso mecanismo de modelo personalizado do Laravel • Modelo ORM expressivo e eloquente para trabalhar com bancos de dados de aplicativos • Informações sobre a função do objeto Illuminate Request no ciclo de vida do aplicativo • PHPUnit, Mockery e Dusk para testar seu código PHP • Ferramentas para escrever API JSON e RESTful • Interfaces para acessar o sistema de arquivos, sessões, cookies,caches e pesquisa • Implementando filas, trabalhos, eventos e publicando eventos WebSocket

Mecanismo de modelo de lâmina


PHP como uma linguagem de modelo funciona relativamente bem. Mas ele tem suas desvantagens, então você não pode usar o <? Php inline em qualquer lugar. A maioria das estruturas modernas possui sua própria linguagem de modelos.

O Laravel oferece seu próprio mecanismo de modelo Blade, baseado no mecanismo .NET Razor. Ele tem uma sintaxe concisa, é bastante compreensível, acompanhado por um modelo de herança poderoso e intuitivo e fácil extensibilidade.

Você pode se familiarizar rapidamente com a aparência do Blade no Exemplo 4.1.

Exemplo 4.1 Exemplos de lâminas

<h1>{{ $group->title }}</h1>
{!! $group->heroImageHtml() !!}

@forelse ($users as $user)
       • {{ $user->first_name }} {{ $user->last_name }}<br>
@empty
       No users in this group.
@endforelse

Como você pode ver, o código Blade usa chaves para Echo e um acordo no qual suas tags de usuário, chamadas "diretivas", são prefixadas com @. Você aplicará diretrizes para todas as suas estruturas de gerenciamento, bem como para herança e quaisquer funções personalizadas que você deseja adicionar.

A sintaxe do Blade é limpa e concisa; portanto, trabalhar com ela é mais fácil e agradável do que com alternativas. Porém, no momento em que você precisa de algo complicado em seus modelos - herança aninhada, condições complexas ou recursão - o mecanismo mostra o seu melhor lado. Como os melhores componentes do Laravel, ele simplifica e faz acesso a requisitos de aplicativos pesados.

Além disso, como toda a sintaxe do Blade é compilada no código PHP comum e depois armazenada em cache, é rápida e permite que você use PHP nativo nos arquivos deste mecanismo, se desejar. No entanto, eu recomendaria evitar o uso do PHP sempre que possível - geralmente se você precisar fazer algo que não é possível com o Blade ou sua diretiva de usuário, isso não se aplica ao modelo.

Exibição de dados


Como você pode ver no Exemplo 4.1, os colchetes {{e}} são usados ​​para quebrar o código PHP que você deseja exibir. O código {{$ $ variable}} age como <? = $ Variable?> No PHP simples.

No entanto, há uma diferença: o Blade protege todos os mapeamentos por padrão com a função PHP htmlentities () para proteger seus usuários de colar scripts maliciosos. Isso significa que {{$ variable}} é funcionalmente equivalente a <? = Htmlentities ($ variable)?>. Se você não quiser escapar da saída, use {!!! e ao invés.
{{ }} -

, Blade ({{}}) -. Laravel , Blade Handlebars?

Blade {{ @. , , :

// Blade; $bladeVariable
//
{{ $bladeVariable }}

// @ "{{ handlebarsVariable }}"
//
@{{ handlebarsVariable }}

verbatim( http://bit.ly/2OnrPRP ).

Estruturas de governo


A maioria das estruturas de controle do Blade será familiar. Muitos duplicam diretamente o nome e a estrutura da mesma tag no PHP.

Existem alguns auxiliares por conveniência, mas no geral as estruturas de controle parecem mais limpas do que no PHP.

Construções Condicionais


Considere a estrutura lógica do gerenciamento.

@if

A expressão @if ($ condition) no Blade é compilada para <? Php if ($ condition):?>.outro, outrose e fim se- com exatamente o mesmo estilo de sintaxe no PHP. Dê uma olhada no

Exemplo 4.2. @E seoutro, outrose e fim se

@if (count($talks) === 1)
     There is one talk at this time period.
@elseif (count($talks) === 0)
     There are no talks at this time period.
@else
     There are {{ count($talks) }} talks at this time period.
@endif

Assim como as expressões condicionais do PHP, você pode misturá-las e combiná-las como quiser. Eles não têm lógica particular; Existe um analisador com uma pesquisa no formato @if ($ condition) e substituição pelo código PHP correspondente.

@unless @endunless

@unless, por outro lado, é uma nova sintaxe que não tem equivalente direto em PHP. Este é o oposto de @if. @unless ($ condition) é o mesmo que <? php if (! $ condition). Você pode ver isso no exemplo 4.3.

Exemplo 4.3 @unless and @endunless

@unless ($user->hasPaid())
       You can complete your payment by switching to the payment tab.
@endunless

Ciclos


Em seguida, considere os ciclos.

@for, @foreach @while

para, para cada e enquantotrabalhe no Blade da mesma maneira que no PHP (exemplos 4.4 a 4.6).

Exemplo 4.4para e @endfor

@for ($i = 0; $i < $talk->slotsCount(); $i++)
      The number is {{ $i }}<br>
@endfor

Exemplo 4.5 para cada e @endforeach

@foreach ($talks as $talk)
       • {{ $talk->title }} ({{ $talk->length }} minutes)<br>
@endforeach

Exemplo 4.6 enquanto e @end enquanto

@while ($item = array_pop($items))
       {{ $item->orSomething() }}<br>
@endwhile

@forelse @endforelse

paraMais é para cada, que pode ser executado mesmo que o objeto que você está procurando esteja vazio. Vimos isso em ação no início do capítulo. O exemplo 4.7 mostra outra opção.

Exemplo 4.7paraoutro

@forelse ($talks as $talk)
       • {{ $talk->title }} ({{ $talk->length }} minutes)<br>
@empty
       No talks this day.
@endforelse

LOOP VARIÁVEL EM DIRETIVAS PARA CADAE as

diretivas @FORELSEpara cada e paraelse (introduzido no Laravel 5.3) adiciona a variável $ loop, que não está disponível nos loops foreach do PHP. Quando usado dentro de um looppara cada ou paraelse stdClass .

• index — 0 ; 0 — « ».

• iteration — 1 ; 1 — « ».

• remaining — , .

• count — .

• first — , , .

• last — , , .

• depth — «» : 1 , 2 . .

• parent — $loop , foreach; caso contrário, nulo.

Aqui está um exemplo de como isso funciona:

<ul>
@foreach ($pages as $page)
       <li>{{ $loop->iteration }}: {{ $page->title }}
             @if ($page->hasChildren())
             <ul>
             @foreach ($page->children() as $child)
             <li>{{ $loop->parent->iteration }}
                   .{{ $loop->iteration }}:
                   {{ $child->title }}</li>
             @endforeach
             </ul>
             @endif
       </li>
@endforeach
</ul>

Herança de modelo


O Blade fornece uma estrutura de herança de modelo que permite que as visualizações se expandam, modifiquem e incluam outras visualizações.

Vamos ver como a herança é estruturada com o Blade.

Definir seções de uma página usando as diretivas @ section / @ show e produção


Vamos começar com o layout Blade de nível superior, como no Exemplo 4.8. Essa é a definição de um wrapper de página universal no qual colocaremos posteriormente o conteúdo específico da página.

Exemplo 4.8 Estrutura da lâmina

<!-- resources/views/layouts/master.blade.php -->
<html>
       <head>
              <title>My Site | @yield('title', 'Home Page')</title>
       </head>
       <body>
              <div class="container">
                    @yield('content')
              </div>
              @section('footerScripts')
                     <script src="app.js"></script>
              @show
       </body>
</html>

Isso se assemelha a uma página HTML comum, mas você pode ver o rendimento em dois lugares (título e conteúdo), e definimos a seção no terceiro (footerScripts). Aqui temos três diretivas Blade: somenteprodução('conteúdo'), produção('title', 'Home Page') com o valor padrão e @ section / @ show com o conteúdo real.

Embora pareçam um pouco diferentes, eles funcionam essencialmente da mesma forma. Todos os três determinam que há uma seção com um nome determinado (o primeiro parâmetro) que pode ser expandido posteriormente e o que fazer se a seção não tiver sido expandida. Eles fazem isso com uma linha de retorno ('Página inicial') ou sem retorno (nada será exibido simplesmente se a diretiva não for expandida) ou com o retorno de todo o bloco (neste caso).

Qual é a diferença? Atprodução('conteúdo') nenhum conteúdo padrão. Além disso, emprodução('title') será exibido apenas se a diretiva não for expandida. Caso contrário, suas seções filho não terão acesso programático ao valor padrão. @ section / @ show define simultaneamente o valor padrão e torna seu conteúdo acessível a seus filhos via @parent.

Se você tiver um layout pai, poderá expandi-lo em um novo arquivo de modelo, como no exemplo 4.9.

Exemplo 4.9 Extensão do layout da lâmina

<!-- resources/views/dashboard.blade.php -->
@extends('layouts.master')

@section('title', 'Dashboard')

@section('content')
       Welcome to your application dashboard!
@endsection

@section('footerScripts')
      @parent
      <script src="dashboard.js"></script>
@endsection

Essa visão filho nos permite mostrar alguns novos conceitos de herança do Blade.

@extends

No Exemplo 4.9, usando @extends ('layouts.master'), determinamos que essa visualização não deve ser exibida por si mesma, mas estende outra visualização. Isso significa que seu papel é estabelecer o conteúdo de várias seções, mas não trabalhar sozinho. Mais como uma série de blocos de conteúdo do que uma página HTML. A linha também determina que a exibição estendida está localizada em resources / views / layouts / master.blade.php.

Cada arquivo deve expandir apenas um outro arquivo e a chamada @extends deve ser a primeira linha do arquivo.

@section @endsection

Usando @section ('title', 'Dashboard'), fornecemos nosso conteúdo para a primeira seção, title. Como o conteúdo é muito curto, em vez de @section e @endsection, usamos um formulário abreviado. Isso permite que você transmita o conteúdo como o segundo parâmetro @section e depois continue. Se você estiver um pouco confuso com @section sem @endsection, poderá usar a sintaxe usual.

A partir da seção @ ('conteúdo'), usamos a sintaxe usual para definir o conteúdo da seção de conteúdo. Até inserirmos uma pequena saudação. No entanto, observe: quando você usa @section em uma exibição filho, termina com @endsection (ou seu aliasPare) em vez de exposição, que é reservado para definir seções nas visualizações pai.

@parent

A partir da seção @ ('footerScripts'), usamos a sintaxe usual para definir o conteúdo da seção footerScripts.

Lembre-se de que realmente definimos esse conteúdo (ou pelo menos seu "valor padrão") já no layout principal. Portanto, desta vez, temos duas opções: sobrescrever o conteúdo da visualização principal ou adicionar a ela.
Você pode ver que temos a capacidade de incluir conteúdo da exibição pai usando a diretiva @parent nesta seção. Caso contrário, o conteúdo da seção será reescrito completamente com tudo o que é definido no pai desta seção.

Inclusão de componentes de apresentação


Agora que descobrimos o básico da herança, mais alguns truques podem ser usados.

@include

E se estivermos em uma visão e quisermos usar outra? Talvez haja um botão de registro, que é desejável adicionar novamente em todo o site. E talvez eu queira selecionar o texto do botão toda vez que o usarmos. Dê uma olhada no Exemplo 4.10.

Exemplo 4.10 Incluir componentes de exibição comincluir

<!-- resources/views/home.blade.php -->
<div class="content" data-page-name="{{ $pageName }}">
      <p>Here's why you should sign up for our app: <strong>It's Great.</strong></p>

      @include('sign-up-button', ['text' => 'See just how great it is'])
</div>

<!-- resources/views/sign-up-button.blade.php -->
<a class="button button--callout" data-page-name="{{ $pageName }}">
      <i class="exclamation-icon"></i> {{ $text }}
</a>

incluirpuxa um componente e transfere dados para ele (opcional). Observe que você não pode apenas transmitir explicitamente dados para inclusão através do segundo parâmetroincluir, mas também consulte quaisquer variáveis ​​no arquivo incluído que estejam disponíveis para a exibição incluída (neste exemplo, $ pageName). Você pode fazer o que quiser, mas eu recomendo que, para maior clareza, sempre passe cada variável que você deseja aplicar.

Você também pode usar diretivasincluirE se incluirQuando e incluirPrimeiro, como mostrado no Exemplo 4.11.

Exemplo 4.11 Incluir visualizações condicionais

{{--  ,    --}}
@includeIf('sidebars.admin', ['some' => 'data'])

{{--  ,     true --}}
@includeWhen($user->isAdmin(), 'sidebars.admin', ['some' => 'data'])

{{--        --}}
@includeFirst(['customs.header', 'header'], ['some' => 'data'])

@each

Você pode imaginar circunstâncias em que precisa iterar sobre uma matriz, uma coleção e incluirparte para cada item. Existe uma diretiva para isso.cada.

Digamos que temos um painel modular lateral e queremos incluir vários módulos com seu próprio nome. Dê uma olhada no Exemplo 4.12.

Exemplo 4.12 Usando os componentes de exibição em um loop comcada

<!-- resources/views/sidebar.blade.php -->
<div class="sidebar">
      @each('partials.module', $modules, 'module', 'partials.empty-module')
</div>

<!-- resources/views/partials/module.blade.php -->
<div class="sidebar-module">
      <h1>{{ $module->title }}</h1>
</div>

<!-- resources/views/partials/empty-module.blade.php -->
<div class="sidebar-module">
      No modules :(
</div>

Considere a sintaxe cada. O primeiro parâmetro é o nome do componente da visualização. O segundo é uma matriz ou coleção para iteração. Terceiro, o nome da variável sob a qual cada elemento (neste caso, cada elemento na matriz $ modules) será passado para a visualização. E o quarto parâmetro opcional é uma exibição que mostra se a matriz ou coleção está vazia (ou, se desejar, você pode passar aqui uma string que será usada como modelo).

Usando pilhas


Talvez o modelo geral seja difícil de gerenciar com o Blade básico - quando cada exibição na hierarquia do Blade precisa adicionar algo a uma seção específica - como adicionar uma entrada a uma matriz.

A situação mais comum é quando determinadas páginas (e às vezes em um sentido mais amplo, determinadas seções do site) possuem arquivos CSS e JavaScript exclusivos e específicos que precisam ser carregados. Imagine que você tenha um arquivo CSS "global" para todo o site, um arquivo CSS para a seção de tarefas e um arquivo CSS para a página "Obter um emprego".

As pilhas de lâminas são feitas exatamente para isso. No modelo pai, defina uma pilha de espaço reservado. Então, em cada modelo filho, você pode "enviar" registros para lá usandoempurrar/ @ endpush, que os adiciona ao final da pilha na imagem final. Você também pode usar @ prepend / @ endprepend para adicioná-los ao início. O exemplo 4.13 ilustra isso.

Exemplo 4.13 Usando pilhas de lâminas

<!-- resources/views/layouts/app.blade.php -->
<html>
<head><!--  --></head>
<body>
       <!--    -->
       <script src="/css/global.css"></script>
       <!-- ,       -->
       @stack('scripts')
</body>
</html>

<!-- resources/views/jobs.blade.php -->
@extends('layouts.app')

@push('scripts')
        <!--  -    -->
        <script src="/css/jobs.css"></script>
@endpush

<!-- resources/views/jobs/apply.blade.php -->
@extends('jobs')

@prepend('scripts')
       <!--  -    -->
       <script src="/css/jobs--apply.css"></script>

@endprepend

Isso leva ao seguinte resultado:

<html>
<head><!--  --></head>
<body>
       <!--    -->
       <script src="/css/global.css"></script>
       <!-- ,       -->
       <script src="/css/jobs--apply.css"></script>
       <script src="/css/jobs.css"></script>
</body>
</html>

Usando componentes e slots


O Laravel oferece outro modelo para incluir conteúdo entre visualizações, introduzido na 5.4: componentes e slots. Os primeiros são mais eficazes em contextos quando você usa visualizações de componentes e passa grandes partes do conteúdo para elas como variáveis. Veja no Exemplo 4.14 uma ilustração de um modelo ou dica de ferramenta que pode alertar o usuário sobre um erro ou outra ação.

Exemplo 4.14 Uma janela modal é um mau exemplo de uma exibição de componente

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div>{{ $content }}</div>
      <div class="close button etc">...</div>
</div>

<!--    -->
@include('partials.modal', [
       'body' => '<p>The password you have provided is not valid. Here are the rules
       for valid passwords: [...]</p><p><a href="#">...</a></p>'
])

Isso é demais para essa variável e é ideal para um componente.

Componentes com slots são componentes de visualizações projetadas para incluir grandes partes ("slots") para recuperar o conteúdo de um modelo incluído. O exemplo 4.15 mostra como fazer engenharia reversa do código do exemplo 4.14 usando componentes e slots.

Exemplo 4.15 Janela modal como um componente mais adequado com slots

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div>{{ $slot }}</div>
      <div class="close button etc">...</div>
</div>

<!--    -->
@component('partials.modal')
        <p>The password you have provided is not valid.
        Here are the rules for valid passwords: [...]</p>

        <p><a href="#">...</a></p>
@endcomponent

Como você pode ver no Exemplo 4.15, a diretiva componentepermite extrair nosso código HTML de uma sequência compactada de uma variável e retornar ao espaço do modelo. A variável $ slot no modelo do nosso componente recebe qualquer conteúdo transferido paracomponente.

Slots compostos


O método que usamos no Exemplo 4.15 é chamado de slot "padrão"; tudo o que você passa entrecomponentee @endcomponent, transmitidos para a variável $ slot. Mas você também pode ter mais do que apenas um slot padrão. Imagine uma janela modal com um título, como no exemplo 4.16.

Exemplo 4.16 Componente de uma representação modal com duas variáveis

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div class="modal-header">{{ $title }}</div>
      <div>{{ $slot }}</div>
      <div class="close button etc">...</div>
</div>

Você pode usar a diretiva ranhura em seus desafios componentetransferir conteúdo para slots diferentes do padrão, como mostra o Exemplo 4.17.

Exemplo 4.17 Transferir mais de um slot para um componente

@component('partials.modal')
        @slot('title')
               Password validation failure
        @endslot

        <p>The password you have provided is not valid.
        Here are the rules for valid passwords: [...]</p>

        <p><a href="#">...</a></p>
@endcomponent

E se, em sua opinião, houver outras variáveis ​​sem sentido como um slot, você ainda poderá passar uma matriz de conteúdo como o segundo parâmetro para componente mesmo que com incluir. Veja o exemplo 4.18.

Exemplo 4.18 Passando dados para um componente sem slots

@component('partials.modal', ['class' => 'danger'])
         ...
@endcomponent

Nomeando um componente como uma diretiva


Existe um truque para simplificar os componentes da chamada: aliases. Apenas chame Blade :: component () na fachada do Blade - o mais comum é o método de inicialização AppServiceProvider () - e passe a localização do componente e, em seguida, o nome da diretiva desejada, como mostra o Exemplo 4.19.

Exemplo 4.19 Pseudonimizando um componente como diretiva

// AppServiceProvider@boot
Blade::component('partials.modal', 'modal');

<!--   -->
@modal
         Modal content here
@endmodal


»Mais informações sobre o livro podem ser encontradas no site da editora
» Conteúdo
» Trecho

Para Khabrozhiteley desconto de 25% no cupom - Laravel

Após o pagamento da versão impressa do livro, um livro eletrônico é enviado por e-mail.

All Articles