Das Buch "Laravel. Komplette Anleitung. 2. Auflage

BildHallo habrozhiteli! Was unterscheidet Laravel von anderen PHP-Frameworks? Geschwindigkeit und Einfachheit. Dank der schnellen Anwendungsentwicklung, eines umfangreichen Ökosystems und des Laravel-Toolkits können Sie schnell Websites und Anwendungen mit sauberem, lesbarem Code erstellen.

Matt Staffer, ein renommierter Lehrer und leitender Entwickler, bietet sowohl einen allgemeinen Überblick über das Framework als auch spezifische Beispiele für die Arbeit damit. Das Buch hilft erfahrenen PHP-Entwicklern, schnell ein neues Thema einzugeben, um ein Projekt auf Laravel zu implementieren. Die Veröffentlichung behandelt auch die Themen Laravel Dusk und Horizon, sammelt Informationen über Community-Ressourcen und andere Pakete, die nicht Teil des Laravel-Kerns sind. In diesem Buch finden Sie: • Tools zum Sammeln, Überprüfen, Normalisieren und Filtern von Benutzerdaten • Blade, eine leistungsstarke benutzerdefinierte Laravel-Vorlagen-Engine • Ausdrucksstarkes eloquentes ORM-Modell für die Arbeit mit Anwendungsdatenbanken • Informationen zur Rolle des Illuminate Request-Objekts im Anwendungslebenszyklus • PHPUnit, Mockery and Dusk zum Testen Ihres PHP-Codes • Tools zum Schreiben von JSON und RESTful API • Schnittstellen für den Zugriff auf das Dateisystem, Sitzungen, Cookies,Caches und Suche • Implementieren von Warteschlangen, Jobs, Ereignissen und Veröffentlichen von WebSocket-Ereignissen

Blade Template Engine


PHP als Vorlagensprache funktioniert relativ gut. Aber es hat seine Nachteile, so dass Sie <? Php nicht überall inline verwenden können. Die meisten modernen Frameworks haben eine eigene Vorlagensprache.

Laravel bietet eine eigene Blade-Template-Engine an, die auf der .NET Razor-Engine basiert. Es hat eine prägnante Syntax, ist ziemlich verständlich, begleitet von einem leistungsstarken und intuitiven Vererbungsmodell und einer einfachen Erweiterbarkeit.

Sie können sich schnell mit dem Aussehen von Blade in Beispiel 4.1 vertraut machen.

Beispiel 4.1 Klingenbeispiele

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

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

Wie Sie sehen können, verwendet der Blade-Code geschweifte Klammern für Echo und eine Vereinbarung, in der den Benutzer-Tags, die als "Direktiven" bezeichnet werden, @ vorangestellt wird. Sie wenden Anweisungen für alle Ihre Verwaltungsstrukturen sowie für die Vererbung und alle benutzerdefinierten Funktionen an, die Sie hinzufügen möchten.

Die Blade-Syntax ist sauber und präzise, ​​sodass das Arbeiten damit einfacher und angenehmer ist als mit Alternativen. Aber in dem Moment, in dem Sie etwas Kompliziertes in Ihren Vorlagen benötigen - verschachtelte Vererbung, komplexe Bedingungen oder Rekursion - zeigt die Engine ihre beste Seite. Wie die besten Komponenten von Laravel vereinfacht es den Zugriff auf umfangreiche Anwendungsanforderungen und ermöglicht den Zugriff darauf.

Da die gesamte Blade-Syntax in regulären PHP-Code kompiliert und dann zwischengespeichert wird, ist sie außerdem schnell und ermöglicht es Ihnen, auf Wunsch natives PHP in Ihren Dateien dieser Engine zu verwenden. Ich würde jedoch empfehlen, die Verwendung von PHP zu vermeiden, wenn dies überhaupt möglich ist. Wenn Sie etwas tun müssen, das mit Blade oder seiner Benutzeranweisung nicht möglich ist, gilt dies normalerweise nicht für die Vorlage.

Datenanzeige


Wie Sie in Beispiel 4.1 sehen können, werden die Klammern {{und}} verwendet, um den PHP-Code zu umbrechen, den Sie anzeigen möchten. Der Code {{$ $ variable}} verhält sich wie <? = $ Variable?> In einfachem PHP.

Es gibt jedoch einen Unterschied: Blade schützt standardmäßig alle Zuordnungen mit der PHP-Funktion htmlentities (), um Ihre Benutzer vor dem Einfügen schädlicher Skripte zu schützen. Dies bedeutet, dass {{$ variable}} funktional <? = Htmlentities ($ variable)?> Entspricht. Wenn Sie der Ausgabe nicht entkommen möchten, verwenden Sie {!!! und stattdessen.
{{ }} -

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

Blade {{ @. , , :

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

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

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

Strukturen regieren


Die meisten Kontrollstrukturen in Blade sind bekannt. Viele duplizieren direkt den Namen und die Struktur desselben Tags in PHP.

Der Einfachheit halber gibt es einige Helfer, aber insgesamt sehen die Kontrollstrukturen sauberer aus als in PHP.

Bedingte Konstruktionen


Betrachten Sie die logische Struktur des Managements.

@if

Der Ausdruck @if ($ condition) in Blade wird zu <? Php if ($ condition):?> Kompiliert.sonst, sonstwenn und endif- mit genau dem gleichen Syntaxstil in PHP. Schauen Sie sich

Beispiel 4.2 an. Beispiel 4.2. @wennsonst, sonstwenn und endif

@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

Wie bei PHPs eigenen bedingten Ausdrücken können Sie sie beliebig mischen und kombinieren. Sie haben keine besondere Logik; Es gibt einen Analysator mit einer Suche in der Form @if ($ condition) und einem Ersatz durch den entsprechenden PHP-Code.

@unless @endunless

@unless hingegen ist eine neue Syntax, die in PHP keine direkte Entsprechung hat. Dies ist das Gegenteil von @if. @unless ($ condition) ist dasselbe wie <? php if (! $ condition). Sie können dies in Beispiel 4.3 sehen.

Beispiel 4.3 @unless und @endunless

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

Fahrräder


Betrachten Sie als nächstes die Zyklen.

@for, @foreach @while

zum, für jedes und währendArbeiten Sie in Blade genauso wie in PHP (Beispiele 4.4–4.6).

Beispiel 4.4zum und @endfor

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

Beispiel 4.5 für jedes und @endforeach

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

Beispiel 4.6. während und @endwhile

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

@forelse @endforelse

zumsonst ist für jedes, die ausgeführt werden kann, auch wenn das gesuchte Objekt leer ist. Wir haben dies am Anfang des Kapitels in Aktion gesehen. Beispiel 4.7 zeigt eine andere Option.

Beispiel 4.7.zumsonst

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

VARIABLE $ LOOP IN DIRECTIVES FÜR JEDESUnd @ FORELSE-

Richtlinienfür jedes und zumelse (eingeführt in Laravel 5.3) fügt die Variable $ loop hinzu, die in PHP foreach-Schleifen nicht verfügbar ist. Bei Verwendung innerhalb einer Schleifefür jedes oder zumelse stdClass .

• index — 0 ; 0 — « ».

• iteration — 1 ; 1 — « ».

• remaining — , .

• count — .

• first — , , .

• last — , , .

• depth — «» : 1 , 2 . .

• parent — $loop , foreach;; sonst null.

Hier ist ein Beispiel, wie dies funktioniert:

<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>

Vererbung von Vorlagen


Blade bietet ein Framework für die Vererbung von Vorlagen, mit dem Ansichten erweitert, geändert und andere Ansichten hinzugefügt werden können.

Mal sehen, wie die Vererbung mit Blade strukturiert ist.

Definieren von Abschnitten einer Seite mit den Anweisungen @ section / @ show und Ausbeute


Beginnen wir mit dem Blade-Layout der obersten Ebene, wie in Beispiel 4.8. Dies ist die Definition eines universellen Seitenumschlags, in den wir später seitenspezifischen Inhalt einfügen.

Beispiel 4.8. Klingenstruktur

<!-- 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>

Dies ähnelt einer normalen HTML-Seite, aber Sie können den Ertrag an zwei Stellen sehen (Titel und Inhalt), und wir haben den Abschnitt im dritten (footerScripts) definiert. Hier haben wir drei Blade-Anweisungen: nurAusbeute('Inhalt'), Ausbeute('title', 'Home Page') mit dem Standardwert und @ section / @ show mit dem tatsächlichen Inhalt.

Obwohl sie etwas anders aussehen, funktionieren sie im Wesentlichen gleich. Alle drei bestimmen, dass es einen Abschnitt mit einem bestimmten Namen gibt (den ersten Parameter), der später erweitert werden kann, und was zu tun ist, wenn der Abschnitt nicht erweitert wurde. Sie tun dies entweder mit einer Rückgabezeile ('Homepage') oder ohne Rückgabe (nichts wird einfach angezeigt, wenn die Direktive nicht erweitert wird) oder mit der Rückgabe des gesamten Blocks (in diesem Fall).

Was ist der Unterschied? BeimAusbeute('Inhalt') kein Standardinhalt. Außerdem inAusbeute('title') wird nur angezeigt, wenn die Direktive nicht erweitert wird. Andernfalls haben die untergeordneten Abschnitte keinen programmgesteuerten Zugriff auf den Standardwert. @ section / @ show definiert gleichzeitig den Standardwert und macht seinen Inhalt über @parent für seine Kinder zugänglich.

Wenn Sie über ein solches übergeordnetes Layout verfügen, können Sie es in einer neuen Vorlagendatei erweitern, wie in Beispiel 4.9.

Beispiel 4.9. Blade-Layout-Erweiterung

<!-- 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

In dieser untergeordneten Ansicht können wir Ihnen einige neue Konzepte der Blade-Vererbung zeigen.

@extends

In Beispiel 4.9 legen wir mit @extends ('layouts.master') fest, dass diese Ansicht nicht selbst angezeigt werden soll, sondern stattdessen eine andere Ansicht erweitert. Dies bedeutet, dass es seine Aufgabe ist, den Inhalt verschiedener Abschnitte festzulegen, aber nicht alleine zu arbeiten. Eher wie eine Reihe von Inhaltsblöcken als eine HTML-Seite. Die Zeile bestimmt auch, dass sich die erweiterte Ansicht unter resources / views / layouts / master.blade.php befindet.

Jede Datei darf nur eine andere Datei erweitern, und der Aufruf von @extends muss die erste Zeile der Datei sein.

@section @endsection

Mit @section ('title', 'Dashboard') stellen wir unseren Inhalt für den ersten Abschnitt, title, bereit. Da der Inhalt sehr kurz ist, verwenden wir anstelle von @section und @endsection ein abgekürztes Formular. Auf diese Weise können Sie den Inhalt als zweiten @ section-Parameter übergeben und dann fortfahren. Wenn Sie mit @section ohne @endsection ein wenig verwirrt sind, können Sie die übliche Syntax verwenden.

Ab @section ('content') verwenden wir die übliche Syntax, um den Inhalt des Inhaltsabschnitts zu definieren. Bis wir einen kleinen Gruß einfügen. Hinweis: Wenn Sie @section in einer untergeordneten Ansicht verwenden, enden Sie mit @endsection (oder seinem Alias)halt) stattdessen Show, das für die Definition von Abschnitten in übergeordneten Ansichten reserviert ist.

@parent

Ab @section ('footerScripts') verwenden wir die übliche Syntax, um den Inhalt des Abschnitts footerScripts zu definieren.

Denken Sie daran, dass wir diesen Inhalt (oder zumindest seinen „Standardwert“) bereits im Hauptlayout definiert haben. Diesmal haben wir also zwei Möglichkeiten: entweder den Inhalt aus der übergeordneten Ansicht überschreiben oder hinzufügen.
Sie können sehen, dass wir mithilfe der @ parent-Direktive in diesem Abschnitt Inhalte aus der übergeordneten Ansicht einfügen können. Andernfalls wird der Inhalt des Abschnitts mit allem, was im übergeordneten Abschnitt dieses Abschnitts definiert ist, vollständig neu geschrieben.

Einbeziehung von Präsentationskomponenten


Nachdem wir die Grundlagen der Vererbung herausgefunden haben, können einige weitere Tricks verwendet werden.

@include

Was ist, wenn wir uns in einer Ansicht befinden und eine andere verwenden möchten? Möglicherweise gibt es eine Registrierungsschaltfläche, die auf der gesamten Website erneut hinzugefügt werden sollte. Und vielleicht möchte ich den Schaltflächentext jedes Mal auswählen, wenn wir ihn verwenden. Schauen Sie sich Beispiel 4.10 an.

Beispiel 4.10. Ansichtskomponenten mit einbeziehenumfassen

<!-- 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>

umfassenRuft eine Komponente auf und überträgt Daten dorthin (optional). Bitte beachten Sie, dass Sie Daten nicht nur explizit über den zweiten Parameter zur Aufnahme übergeben könnenumfassen, verweisen aber auch auf alle Variablen in der enthaltenen Datei, die für die enthaltene Ansicht verfügbar sind (in diesem Beispiel $ pageName). Sie können tun, was Sie wollen, aber ich würde aus Gründen der Klarheit empfehlen, immer jede Variable zu übergeben, die Sie anwenden möchten.

Sie können auch Direktiven verwendenumfassenWenn umfassenWann und umfassenZunächst wie in Beispiel 4.11 gezeigt.

Beispiel 4.11. Bedingte Ansichten einschließen

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

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

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

@each

Sie können sich Umstände vorstellen, unter denen Sie über ein Array, eine Sammlung und iterieren müssen umfassenTeil für jeden Artikel. Hierfür gibt es eine Richtlinie.jeder.

Angenommen, wir haben ein seitliches modulares Panel und möchten mehrere Module mit eigenem Namen einbinden. Schauen Sie sich Beispiel 4.12 an.

Beispiel 4.12. Verwenden von Ansichtskomponenten in einer Schleife mitjeder

<!-- 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>

Betrachten Sie die Syntax jeder. Der erste Parameter ist der Name der Komponente der Ansicht. Das zweite ist ein Array oder eine Sammlung zur Iteration. Drittens wird der Name der Variablen, unter der jedes Element (in diesem Fall jedes Element im Array $ modules) an die Ansicht übergeben wird. Der optionale vierte Parameter ist eine Ansicht, die zeigt, ob das Array oder die Sammlung leer ist (oder wenn Sie möchten, können Sie hier eine Zeichenfolge übergeben, die als Vorlage verwendet wird).

Stapel verwenden


Die generische Vorlage kann mit dem Basis-Blade schwierig zu verwalten sein - wenn jede Ansicht in der Blade-Hierarchie einem bestimmten Abschnitt etwas hinzufügen muss - ähnlich wie das Hinzufügen eines Eintrags zu einem Array.

Die häufigste Situation ist, wenn bestimmte Seiten (und manchmal im weiteren Sinne bestimmte Abschnitte der Website) bestimmte eindeutige CSS- und JavaScript-Dateien enthalten, die sie laden müssen. Stellen Sie sich vor, Sie haben eine "globale" CSS-Datei für die gesamte Site, eine CSS-Datei für den Jobabschnitt und eine CSS-Datei für die Seite "Get a Job".

Blade Stacks sind genau dafür gemacht. Definieren Sie in der übergeordneten Vorlage einen Platzhalterstapel. Anschließend können Sie in jeder untergeordneten Vorlage Datensätze mit "pushen"drücken/ @ endpush, wodurch sie am Ende des Stapels im endgültigen Bild hinzugefügt werden. Sie können auch @ prepend / @ endprepend verwenden, um sie am Anfang hinzuzufügen. Beispiel 4.13 veranschaulicht dies.

Beispiel 4.13. Blade Stacks verwenden

<!-- 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

Dies führt zu folgendem Ergebnis:

<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>

Verwenden von Komponenten und Steckplätzen


Laravel bietet eine weitere Vorlage zum Einfügen von Inhalten zwischen Ansichten, die in 5.4 eingeführt wurde: Komponenten und Slots. Ersteres ist in Kontexten am effektivsten, wenn Sie Komponentenansichten verwenden und große Teile des Inhalts als Variablen an sie übergeben. In Beispiel 4.14 finden Sie eine Abbildung eines Modells oder eines Tooltips, der den Benutzer möglicherweise auf einen Fehler oder eine andere Aktion hinweist.

Beispiel 4.14. Ein modales Fenster ist ein schlechtes Beispiel für eine Komponentenansicht

<!-- 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>'
])

Dies ist zu viel für eine solche Variable und ideal für eine Komponente.

Komponenten mit Slots sind Komponenten von Ansichten, die große Teile („Slots“) zum Abrufen von Inhalten aus einer enthaltenen Vorlage enthalten. Beispiel 4.15 zeigt, wie der Code aus Beispiel 4.14 mithilfe von Komponenten und Steckplätzen rückentwickelt wird.

Beispiel 4.15. Modales Fenster als geeignetere Komponente mit Steckplätzen

<!-- 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

Wie Sie in Beispiel 4.15 sehen können, ist die Direktive KomponenteMit dieser Option können Sie unseren HTML-Code aus einer komprimierten Zeichenfolge einer Variablen extrahieren und zum Vorlagenbereich zurückkehren. Die Variable $ slot in der Vorlage unserer Komponente empfängt alle Inhalte, auf die übertragen wirdKomponente.

Zusammengesetzte Schlitze


Die in Beispiel 4.15 verwendete Methode wird als "Standard" -Slot bezeichnet. alles, was Sie dazwischen gehenKomponenteund @endcomponent, übergeben an die Variable $ slot. Sie können aber auch mehr als nur einen Standardsteckplatz haben. Stellen Sie sich ein modales Fenster mit einem Titel vor, wie in Beispiel 4.16.

Beispiel 4.16. Bestandteil einer modalen Darstellung mit zwei Variablen

<!-- 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>

Sie können die Direktive verwenden Slot in ihren Herausforderungen Komponenteum Inhalte in andere als die Standardsteckplätze zu übertragen, wie in Beispiel 4.17 gezeigt.

Beispiel 4.17. Übertragen Sie mehr als einen Steckplatz auf eine Komponente

@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

Und wenn es Ihrer Ansicht nach andere Variablen gibt, die als Slot bedeutungslos sind, können Sie dennoch ein Array von Inhalten als zweiten Parameter an übergeben Komponente das gleiche wie bei umfassen. Schauen Sie sich Beispiel 4.18 an.

Beispiel 4.18. Übergeben von Daten an eine Komponente ohne Steckplätze

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

Benennen einer Komponente als Direktive


Es gibt einen Trick, um die Komponenten für den Aufruf zu vereinfachen: Aliase. Rufen Sie einfach Blade :: component () an der Blade-Fassade auf - die häufigste ist die AppServiceProvider-Methode boot () - und übergeben Sie ihr den Speicherort der Komponente und dann den Namen der gewünschten Direktive, wie in Beispiel 4.19 gezeigt.

Beispiel 4.19. Pseudonymisierung einer Komponente als Direktive

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

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


»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers.
» Inhalt
» Auszug

für Khabrozhiteley 25% Rabatt auf den Gutschein - Laravel

Nach Zahlung der Papierversion des Buches wird ein elektronisches Buch per E-Mail verschickt.

All Articles