Le livre "Laravel. Guide complet. 2e Ă©dition

imageBonjour, habrozhiteli! Qu'est-ce qui distingue Laravel des autres frameworks PHP? Rapidité et simplicité. Le développement rapide d'applications, un écosystème étendu et la boîte à outils Laravel vous permettent de créer rapidement des sites et des applications avec un code propre et lisible.

Matt Staffer, un enseignant renommé et développeur principal, offre à la fois un aperçu général du cadre et des exemples spécifiques de travail avec celui-ci. Le livre aidera les développeurs PHP expérimentés à entrer rapidement un nouveau sujet pour implémenter un projet sur Laravel. La publication couvre également les sujets de Laravel Dusk et Horizon, recueille des informations sur les ressources communautaires et d'autres packages qui ne font pas partie du noyau de Laravel. Dans ce livre, vous trouverez: • Des outils pour collecter, vérifier, normaliser, filtrer les données utilisateur • Blade, un puissant moteur de modèle personnalisé Laravel • Un modèle ORM expressif éloquent pour travailler avec les bases de données d'application • Des informations sur le rôle de l'objet Illuminate Request dans le cycle de vie de l'application • PHPUnit, Moquerie et crépuscule pour tester votre code PHP • Outils pour écrire JSON et API RESTful • Interfaces pour accéder au système de fichiers, sessions, cookies,caches et recherche • Implémentation de files d'attente, de travaux, d'événements et publication d'événements WebSocket

Moteur de modèle de lame


PHP en tant que langage de modèle fonctionne relativement bien. Mais il a ses inconvénients, vous ne pouvez donc pas utiliser <? Php inline partout. La plupart des frameworks modernes ont leur propre langage de modèle.

Laravel propose son propre moteur de modèle de lame basé sur le moteur .NET Razor. Il a une syntaxe concise, est assez compréhensible, accompagné d'un modèle d'héritage puissant et intuitif et d'une extensibilité facile.

Vous pouvez rapidement vous familiariser avec l'apparence de Blade dans l'exemple 4.1.

Exemple 4.1 Exemples de lames

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

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

Comme vous pouvez le voir, le code Blade utilise des accolades pour Echo et un accord dans lequel ses balises utilisateur, appelées "directives", sont préfixées par @. Vous appliquerez des directives pour toutes vos structures de gestion, ainsi que pour l'héritage et toutes les fonctions personnalisées que vous souhaitez ajouter.

La syntaxe Blade est propre et concise, donc travailler avec elle est plus facile et plus agréable qu'avec des alternatives. Mais au moment où vous avez besoin de quelque chose de compliqué dans vos modèles - héritage imbriqué, conditions complexes ou récursivité - le moteur montre son meilleur côté. Comme les meilleurs composants de Laravel, il simplifie et rend accessible les exigences applicatives lourdes.

De plus, comme toute la syntaxe Blade est compilée en code PHP normal puis mise en cache, elle est rapide et vous permet d'utiliser du PHP natif dans vos fichiers de ce moteur si vous le souhaitez. Cependant, je recommanderais d'éviter d'utiliser PHP lorsque cela est possible - généralement si vous devez faire quelque chose qui n'est pas possible avec Blade ou sa directive utilisateur, cela ne s'applique pas au modèle.

Affichage des données


Comme vous pouvez le voir dans l'exemple 4.1, les crochets {{et}} sont utilisés pour encapsuler le code PHP que vous souhaitez afficher. Le code {{$ $ variable}} agit comme <? = $ Variable?> En PHP simple.

Cependant, il y a une différence: Blade protège tous les mappages par défaut avec la fonction PHP htmlentities () pour protéger vos utilisateurs contre le collage de scripts malveillants. Cela signifie que {{$ variable}} est fonctionnellement équivalent à <? = Htmlentities ($ variable)?>. Si vous ne voulez pas échapper à la sortie, utilisez {!!! et plutôt.
{{ }} -

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

Blade {{ @. , , :

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

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

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

Structures de gouvernance


La plupart des structures de contrôle dans Blade seront familières. Beaucoup dupliquent directement le nom et la structure de la même balise en PHP.

Il existe quelques aides pour plus de commodité, mais dans l'ensemble, les structures de contrôle sont plus propres qu'en PHP.

Constructions conditionnelles


Considérez la structure logique de la gestion.

@if

L'expression @if ($ condition) dans Blade se compile en <? Php if ($ condition):?>.autre, autresi et fin si- avec exactement le mĂŞme style de syntaxe en PHP. Jetez un Ĺ“il Ă  l'

exemple 4.2 Exemple 4.2. @siautre, autresi et fin si

@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

Comme avec les propres expressions conditionnelles de PHP, vous pouvez les mélanger et les combiner à votre guise. Ils n'ont pas de logique particulière; Il y a un analyseur avec une recherche sous la forme @if ($ condition) et un remplacement avec le code PHP correspondant.

@unless @endunless

@unless, d'autre part, est une nouvelle syntaxe qui n'a pas d'équivalent direct en PHP. C'est l'opposé de @if. @unless ($ condition) est identique à <? php if (! $ condition). Vous pouvez le voir dans l'exemple 4.3.

Exemple 4.3 @unless et @endunless

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

Cycles


Ensuite, considérez les cycles.

@for, @foreach @while

pour, pour chaque et tandis quefonctionne dans Blade de la même manière qu'en PHP (exemples 4.4–4.6).

Exemple 4.4pour et @endfor

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

Exemple 4.5 pour chaque et @endforeach

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

Exemple 4.6. tandis que et @ en attendant

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

@forelse @endforelse

poursinon pour chaque, qui peut être exécuté même si l'objet que vous recherchez est vide. Nous l'avons vu en action au début du chapitre. L'exemple 4.7 montre une autre option.

Exemple 4.7.pourautre

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

BOUCLE VARIABLE EN DIRECTIVES POUR CHAQUEEt les

directives @FORELSEpour chaque et pourelse (introduit dans Laravel 5.3) ajoute la variable $ loop, qui n'est pas disponible dans les boucles PHP foreach. Lorsqu'il est utilisé dans une bouclepour chaque ou pourelse stdClass .

• index — 0 ; 0 — « ».

• iteration — 1 ; 1 — « ».

• remaining — , .

• count — .

• first — , , .

• last — , , .

• depth — «» : 1 , 2 . .

• parent — $loop , foreach; sinon nul.

Voici un exemple de comment cela fonctionne:

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

Héritage de modèle


Blade fournit un cadre d'héritage de modèle qui permet aux vues d'agrandir, de modifier et d'inclure d'autres vues.

Voyons comment l'héritage est structuré avec Blade.

DĂ©finition de sections d'une page Ă  l'aide des directives @ section / @ show et rendement


Commençons par la disposition de niveau supérieur de la lame, comme dans l'exemple 4.8. Il s'agit de la définition d'un wrapper de page universel dans lequel nous placerons plus tard du contenu spécifique à la page.

Exemple 4.8. Structure de la lame

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

Cela ressemble à une page HTML standard, mais vous pouvez voir le rendement à deux endroits (titre et contenu), et nous avons défini la section dans le troisième (footerScripts). Ici, nous avons trois directives Blade: seulementrendement('contenu'), rendement('title', 'Home Page') avec la valeur par défaut et @ section / @ show avec le contenu réel.

Bien qu'ils semblent un peu différents, ils fonctionnent essentiellement de la même manière. Les trois déterminent qu'il existe une section portant un nom donné (le premier paramètre) qui peut être développée ultérieurement et que faire si la section n'a pas été développée. Ils le font soit avec une ligne de retour ('Page d'accueil'), soit sans retour (rien ne sera affiché si la directive n'est pas développée), ou avec le retour de tout le bloc (dans ce cas).

Quelle est la différence? Àrendement('contenu') pas de contenu par défaut. En outre, dansrendement('title'), il ne sera affiché que si la directive n'est pas développée. Sinon, ses sections enfants n'auront pas accès par programmation à la valeur par défaut. @ section / @ show définit simultanément la valeur par défaut et rend son contenu accessible à ses enfants via @parent.

Si vous avez une telle disposition parent, vous pouvez la développer dans un nouveau fichier de modèle, comme dans l'exemple 4.9.

Exemple 4.9. Extension de disposition de lame

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

Cette vue enfant nous permet de vous montrer quelques nouveaux concepts d'héritage de Blade.

@extends

Dans l'exemple 4.9, en utilisant @extends ('layouts.master'), nous déterminons que cette vue ne doit pas être affichée seule, mais étend plutôt une autre vue. Cela signifie que son rôle est de définir le contenu des différentes sections, mais pas de travailler seul. Plus comme une série de blocs de contenu qu'une page HTML. La ligne détermine également que la vue qu'elle étend se trouve dans resources / views / layouts / master.blade.php.

Chaque fichier ne doit développer qu'un seul autre fichier et l'appel @extends doit être la première ligne du fichier.

@section @endsection

En utilisant @section ('title', 'Dashboard'), nous fournissons notre contenu pour la première section, title. Le contenu étant très court, au lieu de @section et @endsection, nous utilisons une forme abrégée. Cela vous permet de passer le contenu en tant que deuxième paramètre @section, puis de continuer. Si vous êtes un peu confus avec @section sans @endsection, vous pouvez utiliser la syntaxe habituelle.

À partir de @section («contenu»), nous utilisons la syntaxe habituelle pour définir le contenu de la section de contenu. Jusqu'à ce que nous insérions une petite salutation. Cependant, notez: lorsque vous utilisez @section dans une vue enfant, vous finissez par @endsection (ou son aliasArrêtez) au lieu spectacle, réservé à la définition de sections dans les vues parent.

@parent

À partir de @section ('footerScripts'), nous utilisons la syntaxe habituelle pour définir le contenu de la section footerScripts.

N'oubliez pas que nous avons défini ce contenu (ou du moins sa «valeur par défaut») déjà dans la mise en page principale. Cette fois, nous avons donc deux options: soit écraser le contenu de la vue parent, soit y ajouter.
Vous pouvez voir que nous avons la possibilité d'inclure du contenu de la vue parent en utilisant la directive @parent dans cette section. Sinon, le contenu de la section sera complètement réécrit avec tout ce qui est défini dans le parent de cette section.

Inclusion de composants de présentation


Maintenant que nous avons compris les bases de l'héritage, quelques astuces supplémentaires peuvent être utilisées.

@include

Et si nous sommes dans une vue et que nous voulons en utiliser une autre? Il y a peut-être un bouton d'enregistrement, qu'il est souhaitable d'ajouter à nouveau sur tout le site. Et peut-être que je veux sélectionner le texte du bouton chaque fois que nous l'utilisons. Jetez un œil à l'exemple 4.10.

Exemple 4.10. Inclure les composants de vue aveccomprendre

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

comprendreextrait un composant et y transfère des données (facultatif). Veuillez noter que vous pouvez non seulement transmettre explicitement des données à inclure via le deuxième paramètrecomprendre, mais également faire référence à toutes les variables du fichier inclus qui sont disponibles pour la vue incluse (dans cet exemple, $ pageName). Vous pouvez faire ce que vous voulez, mais je recommanderais pour plus de clarté de toujours passer chaque variable que vous avez l'intention d'appliquer.

Vous pouvez également utiliser des directivescomprendreSi comprendreQuand et comprendreTout d'abord, comme illustré dans l'exemple 4.11.

Exemple 4.11. Inclure des vues conditionnelles

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

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

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

@each

Vous pouvez imaginer des circonstances oĂą vous devez parcourir un tableau, une collection et comprendrepartie pour chaque article. Il existe une directive pour cela.chaque.

Disons que nous avons un panneau modulaire latéral et que nous voulons inclure plusieurs modules avec leur propre nom. Jetez un œil à l'exemple 4.12.

Exemple 4.12. Utilisation de composants de vue en boucle avecchaque

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

Considérez la syntaxe chaque. Le premier paramètre est le nom du composant de la vue. Le second est un tableau ou une collection pour l'itération. Troisièmement, le nom de la variable sous laquelle chaque élément (dans ce cas, chaque élément du tableau $ modules) sera passé à la vue. Et le quatrième paramètre facultatif est une vue montrant si le tableau ou la collection est vide (ou si vous le souhaitez, vous pouvez passer ici une chaîne qui sera utilisée comme modèle).

Utilisation de piles


Le modèle général est peut-être difficile à gérer avec le Blade de base - lorsque chaque vue de la hiérarchie Blade doit ajouter quelque chose à une section spécifique - tout comme l'ajout d'une entrée à un tableau.

La situation la plus courante est lorsque certaines pages (et parfois dans un sens plus large certaines sections du site) ont des fichiers CSS et JavaScript uniques spécifiques qu'elles doivent charger. Imaginez que vous ayez un fichier CSS «global» pour l'ensemble du site, un fichier CSS pour la section emploi et un fichier CSS pour la page «Obtenir un emploi».

Les piles de lames sont faites pour cela. Dans le modèle parent, définissez une pile d'espace réservé. Ensuite, dans chaque modèle enfant, vous pouvez «pousser» les enregistrementspousser/ @ endpush, qui les ajoute à la fin de la pile dans l'image finale. Vous pouvez également utiliser @ prepend / @ endprepend pour les ajouter au début. L'exemple 4.13 illustre cela.

Exemple 4.13. Utilisation de piles de lames

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

Cela conduit au résultat suivant:

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

Utilisation de composants et d'emplacements


Laravel propose un autre modèle pour inclure du contenu entre les vues, qui a été introduit dans 5.4: composants et emplacements. Les premiers sont plus efficaces dans les contextes lorsque vous utilisez des vues de composant et leur passez de grandes parties de contenu en tant que variables. Consultez l'exemple 4.14 pour une illustration d'un modèle ou d'une info-bulle qui pourrait alerter l'utilisateur d'une erreur ou d'une autre action.

Exemple 4.14. Une fenĂŞtre modale est un mauvais exemple de vue de composant

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

C'est trop pour une telle variable et c'est idéal pour un composant.

Les composants avec emplacements sont des composants de vues qui sont conçus pour inclure de grandes portions («emplacements») pour récupérer le contenu d'un modèle inclus. L'exemple 4.15 montre comment désosser le code de l'exemple 4.14 à l'aide de composants et d'emplacements.

Exemple 4.15. Fenêtre modale en tant que composant plus approprié avec des fentes

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

Comme vous pouvez le voir dans l'exemple 4.15, la directive composantvous permet d'extraire notre code HTML à partir d'une chaîne compressée d'une variable et retourne à l'espace du modèle. La variable $ slot dans le modèle de notre composant reçoit tout contenu transféré verscomposant.

Emplacements composés


La méthode que nous avons utilisée dans l'exemple 4.15 est appelée l'emplacement «par défaut»; tout ce que vous passez entrecomposantet @endcomponent, passés à la variable $ slot. Mais vous pouvez également avoir plus qu'un simple emplacement par défaut. Imaginez une fenêtre modale avec un titre, comme dans l'exemple 4.16.

Exemple 4.16. Composante d'une représentation modale à deux variables

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

Vous pouvez utiliser la directive fente dans leurs défis composantpour transférer du contenu vers des emplacements autres que ceux par défaut, comme illustré dans l'exemple 4.17.

Exemple 4.17. Transférer plusieurs emplacements vers un composant

@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

Et si, à votre avis, il existe d'autres variables qui n'ont pas de sens en tant qu'emplacement, vous pouvez toujours transmettre un tableau de contenu comme deuxième paramètre à composant comme avec comprendre. Jetez un œil à l'exemple 4.18.

Exemple 4.18. Transmission de données à un composant sans emplacements

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

Nommer un composant en tant que directive


Il existe une astuce pour simplifier les composants de l'appel: les alias. Appelez simplement Blade :: component () sur la façade Blade - la plus courante est la méthode boot () AppServiceProvider - et passez-lui l'emplacement du composant puis le nom de la directive souhaitée, comme indiqué dans l'exemple 4.19.

Exemple 4.19. Pseudonymiser un composant en tant que directive

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

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


»Plus d'informations sur le livre peuvent être trouvées sur le site de l'éditeur
» Sommaire
» Extrait

pour Khabrozhiteley 25% de réduction sur le coupon - Laravel

Lors du paiement de la version papier du livre, un livre électronique est envoyé par e-mail.

All Articles