Maison  >  Article  >  développement back-end  >  Explication détaillée du moteur de modèle Blade dans Laravel

Explication détaillée du moteur de modèle Blade dans Laravel

黄舟
黄舟original
2017-10-11 09:06:053299parcourir

Le moteur de modèles de Laravel utilise le moteur de modèles Blade. L'article suivant vous présente principalement les informations pertinentes sur le moteur de modèles Blade dans Laravel. L'article le présente en détail à travers un exemple de code, ce qui est d'une certaine importance pour l'étude ou l'étude de chacun. travail En référence à la valeur d'apprentissage, les amis qui en ont besoin peuvent suivre l'éditeur pour apprendre ensemble.

Avant-propos

Cet article vous présente principalement le contenu pertinent sur le moteur de modèles Blade dans Laravel, et le partage pour votre référence et votre étude . Assez dit, jetons un œil à l’introduction détaillée.

Moteur de modèles Blade

Blade est un moteur de modèles simple et puissant fourni par Laravel. Il compile la vue Blade en PHP natif. codez-le et mettez-le en cache. Le cache change lorsque la vue Blade change, ce qui signifie que Blade n'ajoute aucune charge de compilation à votre application. Les fichiers de vue Blade utilisent le suffixe .blade.php et sont généralement stockés dans le répertoire resources/views.

Héritage de modèles

Regardons d'abord un exemple


<!-- Stored in resources/views/layouts/master.blade.php-->
<html>
 <head>
 <title>App Name - @yield(&#39;title&#39;)</title>
 </head>
 <body>
 @section(&#39;sidebar&#39;)
  This is the master sidebar.
 @show
 
 <p class="container">
  @yield(&#39;content&#39;)
 </p>
 </body>
</html>

Les fichiers de modèles Blade contiennent un balisage HTML typique. Vous devez avoir vu les directives @section et @yield. La directive @section définit une section de contenu comme son nom l'indique, tandis que la directive @yield est utilisée pour afficher le contenu contenu dans la section widget fournie. Maintenant que nous avons défini une disposition de base, nous pouvons utiliser la directive @extends de Blade pour hériter explicitement de cette disposition. Utilisez ensuite la directive @section pour monter le contenu du widget dans la mise en page. Dans l'exemple ci-dessus, le contenu du widget sera monté dans la section @yield de la mise en page :


<!-- Stored in resoures/views/child.blade.php -->
@extends(&#39;layouts.master&#39;)
 
@section(&#39;title&#39;, &#39;Page Title&#39;)
 
@section(&#39;sidebar&#39;)
 @parent
 
 <p>This is appended to the master sidebar.</p>
@endsection
 
@section(&#39;content&#39;)
 <p>This is my body content.</p>
@endsection
Dans l'exemple ci-dessus, le widget de la barre latérale utilise la directive @parent pour ajouter le contenu de la partie de la barre latérale de la mise en page. Si elle n'est pas utilisée, cette partie de la mise en page sera écrasée. La directive @parent remplace le contenu de la mise en page par le contenu de la vue lors de son rendu.


Les vues Blade peuvent utiliser la vue de fonction d'assistance globale pour renvoyer le contenu rendu, tout comme les vues PHP natives :


Route::get(&#39;blade&#39;, function () {
 return view(&#39;child&#39;);
});

Afficher les données

Vous pouvez utiliser des accolades { pour afficher les variables transmises dans la vue. Par exemple, vous définissez l'itinéraire suivant :


Vous pouvez afficher le contenu de la variable name dans la vue comme ceci :
Route::get(&#39;greeting&#39;, function () {
 return view(&#39;welcome&#39;, [&#39;name&#39; => &#39;Duicode&#39;]);
})


Bien sûr, vous Le contenu peut également être renvoyé à partir de méthodes PHP natives. En fait, vous pouvez utiliser du code PHP arbitraire dans la déclaration d'écho Blade : (Le contenu de la déclaration Blade {{}} est automatiquement filtré par la méthode htmlentities pour empêcher les attaques XSS.)
Hello, {{ $name }}


Étant donné que de nombreux frameworks JavaScript utilisent des accolades pour indiquer que l'expression fournie doit être affichée dans le navigateur. Vous pouvez donc utiliser le symbole @ pour indiquer au moteur de rendu Blade que vous souhaitez que cette expression soit laissée telle quelle :
The current UNIX timestamp is {{ time() }}


Nous utilisons souvent l'opérateur ternaire pour attribuer valeurs
Hello, @{{ name }}


Blade fournit un moyen pratique de remplacer cette déclaration ternaire :
{{ isset($name) ? $name : &#39;Default&#39; }}


La déclaration Blade {{} } par défaut utilisera automatiquement la méthode htmlentities pour éviter les attaques XSS. Si vous ne souhaitez pas que vos données soient échappées, vous pouvez utiliser la syntaxe suivante, mais attention, faites attention aux attaques :
{{ $name or &#39;Default&#39; }}


Hello, {!! $name !!}

Structure de contrôle
Vous pouvez utiliser la structure de contrôle if via les directives @if, @elseif, @else et @endif :


Bien entendu, pour plus de commodité, Blade propose également une commande alternative à la commande @unless :
@if (count($records) === 1)
 I have one record!
@elseif (count($records) > 1)
 I have multiple records!
@else
 I don&#39;t have any records!
@endif


Vous pouvez également utiliser la commande @hasSection pour déterminer si le widget fourni à la mise en page contient du contenu :
@unless (Auth::check())
 You are not signed in.
@endunless


En matière de contrôle, les structures en boucle sont indispensables , similaire à PHP :
<title>
 @hasSection(&#39;title&#39;)
 @yield(&#39;title&#39;) - App Name
 @else
 App Name
 @endif
</title>


Blade fournit également des instructions pour terminer l'itération ou annuler l'itération en cours :
@for ($i = 0; $i < 10; $i++)
 The current value is {{ $i }}
@endfor
 
@foreach ($users as $user)
 <p>This is user {{ $user->id }}</p>
@endforeach
 
@forelse ($users as $user)
 <li>{{ $user->name }}</li>
@empty
 <p>No users</p>
@endforelse
 
@while (true)
 <p>I&#39;m looping forever.</p>
@endwhile


Vous pouvez également utiliser des instructions pour déclarer des conditions. Atteindre la pause :
@foreach ($users as $user)
 @if($user->type == 1)
 @continue
 @endif
 
 <li>{{ $user->name }}</li>
 
 @if($user->number == 5)
 @break
 @endif
@endforeach


@foreach ($users as $user)
 @continue($user->type == 1)
 
 <li>{{ $user->name }}</li>
 
 @break($user->number == 5)
@endforeach

Y compris les sous-vues
Vous pouvez utiliser la directive @include Pour contenir le contenu d'une vue, les variables de la vue actuelle seront également partagées avec la sous-vue :


Bien que la sous-vue hérite automatiquement de toutes les données des variables de la vue parent, vous pouvez également transmettre directement une variable de tableau pour ajouter des variables supplémentaires à la sous-vue (évitez d'utiliser les constantes __DIR__ et __FILE__ dans les vues Blade, car elles se résoudront en l'emplacement du cache de vues) :
<p>
 @include(&#39;shared.errors&#39;)
 
 <form>
 <!-- Form Contents -->
 </form>
</p>


Vous pouvez utiliser la directive @each de Blade pour fusionner et introduire plusieurs vues sur une seule ligne :
@include(&#39;view.name&#39;, [&#39;some&#39; => &#39;data&#39;])


Premier Le premier paramètre est le nom de la vue qui doit être rendue pour chaque élément du tableau ou de la collection.
@each(&#39;view.name&#39;, $jobs, &#39;job&#39;)


Le deuxième paramètre est un tableau ou une collection utilisée pour fournir une itération.

第三个参数是要分配给当前视图的变量名。

你也可以传递第四个参数到 @each 指令。如果所提供的数组是空数组的话,该参数所提供的视图将会被引入。


@each(&#39;view.name&#39;, $jobs, &#39;job&#39;, &#39;view.empty&#39;)

Blade 中的注释,这样写不会被渲染:


{{-- This comment will not be present in the rendered HTML --}}

Blade 允许你在已命名的堆中压入内容:


@push(&#39;scripts&#39;)
 <script src="/example.js"></script>
@endpush

你可以在你需要的时候压入相同的堆任意的次数,你需要在布局中使用 @stack 来渲染堆:


<head>
 <!-- Head Contents -->
 @stack(&#39;scripts&#39;)
</head>

可以使用 @inject 指令来从服务容器中取回服务:


@inject(&#39;metrics&#39;, &#39;App\Services\MetricsService&#39;)
<p>
 Monthly Revenue: {{ $metrice->monthlyRevenue() }}
</p>

第一个参数将作为所取回服务存放的变量名,

第二个参数是你想要在服务容器中取回的类或接口名称。

可以使用 directvie 方法来注册指令。当 Blade 编译器遇到该指令时,它会自动的调用该指令注册时提供的回调函数并传递它的参数。

下面的例子创建了 @datetime($val) 指令来格式化 $val:


<?php
namespace App\Providers;
 
use Blade;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider{
 /**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot(){
  Blade::directive(&#39;datetime&#39;, function ($expression) {
  return "<?php echo with{$express}->format(&#39;m/d/Y H:i&#39;); ?>";
  });
 }
 
 /**
 * Register bindings in the container
 *
 * @return void
 */
 public function register() {
  //
 }
}

上面的例子中使用了 Laravel 的 with 帮助方法,它只是简单的返回一个所提供的对象或值,并提供方便的链式调用。最终该指令生成的 PHP 代码如下:


<?php echo with($var)->format(&#39;m/d/Y H:i&#39;); ?>

在你更新 Blade 指令的逻辑之后,你应该删除所有已缓存的 Blade 视图,你可以使用 view:clear Artisan 命令来清除。

总结

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn