Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der Blade-Template-Engine in Laravel

Detaillierte Erklärung der Blade-Template-Engine in Laravel

黄舟
黄舟Original
2017-10-11 09:06:053296Durchsuche

Die Template-Engine von Laravel verwendet die Blade-Template-Engine. Der folgende Artikel führt Sie hauptsächlich in die relevanten Informationen über die Blade-Template-Engine in Laravel ein In Bezug auf den Wert des Lernens können Freunde, die es benötigen, dem Herausgeber folgen, um gemeinsam zu lernen.

Vorwort

Dieser Artikel stellt Ihnen hauptsächlich die relevanten Inhalte zur Blade-Vorlagen-Engine in Laravel vor und stellt sie Ihnen als Referenz und zum Studium zur Verfügung . Genug gesagt, werfen wir einen Blick auf die ausführliche Einführung.

Blade-Template-Engine

Blade ist eine einfache und leistungsstarke Template-Engine, die von Laravel bereitgestellt wird. Sie kompiliert die Blade-Ansicht in natives PHP Code erstellen und zwischenspeichern. Der Cache ändert sich, wenn sich die Blade-Ansicht ändert, was bedeutet, dass Blade Ihrer Anwendung keinen Kompilierungsaufwand hinzufügt. Blade-Ansichtsdateien verwenden das Suffix .blade.php und werden im Allgemeinen im Verzeichnis resources/views gespeichert.

Vorlagenvererbung

Schauen wir uns zunächst ein Beispiel an


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

Blade-Vorlagendateien enthalten typisches HTML-Markup. Sie müssen die Anweisungen @section und @yield gesehen haben. Die @section-Direktive definiert einen Inhaltsabschnitt, wie der Name schon sagt, während die @yield-Direktive verwendet wird, um den im bereitgestellten Widget-Abschnitt enthaltenen Inhalt anzuzeigen. Nachdem wir nun ein Grundlayout definiert haben, können wir die @extends-Direktive von Blade verwenden, um dieses Layout explizit zu erben. Verwenden Sie dann die @section-Direktive, um den Inhalt des Widgets in das Layout einzubinden. Im obigen Beispiel wird der Inhalt des Widgets in den @yield-Abschnitt des Layouts eingebunden:


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

Im obigen Beispiel verwendet das Sidebar-Widget die @parent-Direktive, um den Inhalt des Sidebar-Teils des Layouts anzuhängen. Wenn dieser Teil des Layouts nicht verwendet wird, wird er überschrieben. Die @parent-Direktive ersetzt beim Rendern den Inhalt des Layouts durch den Inhalt der Ansicht.

Blade-Ansichten können die globale Hilfsfunktion view verwenden, um gerenderte Inhalte zurückzugeben, genau wie native PHP-Ansichten:


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

Daten anzeigen

Sie können geschweifte Klammern { verwenden, um in der Ansicht übergebene Variablen anzuzeigen. Sie definieren beispielsweise die folgende Route:


Route::get(&#39;greeting&#39;, function () {
 return view(&#39;welcome&#39;, [&#39;name&#39; => &#39;Duicode&#39;]);
})

Sie können den Inhalt der Namensvariablen in der Ansicht wie folgt ausgeben:


Hello, {{ $name }}

Natürlich Sie Außerdem können Inhalte von nativen PHP-Methoden zurückgegeben werden. Tatsächlich können Sie beliebigen PHP-Code in der Blade-Echo-Deklaration verwenden: (Der Inhalt in der Blade-{{}}-Deklaration wird automatisch durch die htmlentities-Methode gefiltert, um XSS-Angriffe zu verhindern.)


The current UNIX timestamp is {{ time() }}

Da viele JavaScript-Frameworks geschweifte Klammern verwenden, um anzugeben, dass der bereitgestellte Ausdruck im Browser angezeigt werden soll. Sie können also das @-Symbol verwenden, um der Blade-Rendering-Engine mitzuteilen, dass dieser Ausdruck unverändert bleiben soll:


Hello, @{{ name }}

Wir verwenden häufig den ternären Operator zum Zuweisen Werte


{{ isset($name) ? $name : &#39;Default&#39; }}

Blade bietet eine praktische Möglichkeit, diese ternäre Deklaration zu ersetzen:


{{ $name or &#39;Default&#39; }}

Die Standard-Blade-{{}}-Deklaration verwendet automatisch die htmlentities-Methode, um XSS-Angriffe zu vermeiden. Wenn Sie nicht möchten, dass Ihre Daten maskiert werden, können Sie die folgende Syntax verwenden. Seien Sie jedoch vorsichtig und nehmen Sie sich vor Angriffen in Acht:


Hello, {!! $name !!}

Kontrollstruktur

Sie können die if-Kontrollstruktur über die Anweisungen @if, @elseif, @else und @endif verwenden:


@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

Der Einfachheit halber bietet Blade natürlich auch einen alternativen Befehl zum @unless-Befehl:


@unless (Auth::check())
 You are not signed in.
@endunless

Sie können auch den Befehl @hasSection verwenden, um festzustellen, ob das für das Layout bereitgestellte Widget Inhalte enthält:


<title>
 @hasSection(&#39;title&#39;)
 @yield(&#39;title&#39;) - App Name
 @else
 App Name
 @endif
</title>

Wenn es um die Steuerung geht, sind Schleifenstrukturen unverzichtbar , ähnlich wie PHP:


@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

Blade bietet auch Anweisungen zum Beenden der Iteration oder zum Abbrechen der aktuellen Iteration:


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

Sie können auch Anweisungen zum Erreichen der Pause verwenden:


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

Einschließlich Unteransichten

Sie können die @include-Direktive verwenden. Um den Inhalt einer Ansicht einzuschließen, werden Variablen in der aktuellen Ansicht auch mit der Unteransicht geteilt:


<p>
 @include(&#39;shared.errors&#39;)
 
 <form>
 <!-- Form Contents -->
 </form>
</p>

Obwohl die Unteransicht automatisch alle Daten von den Variablen der übergeordneten Ansicht erbt, können Sie auch eine Array-Variable direkt übergeben, um der Unteransicht zusätzliche Variablen hinzuzufügen (vermeiden Sie die Verwendung der Konstanten __DIR__ und __FILE__ in Blade-Ansichten, da diese in aufgelöst werden). der Speicherort des Ansichtscache):


@include(&#39;view.name&#39;, [&#39;some&#39; => &#39;data&#39;])

Sie können die @each-Direktive von Blade verwenden, um mehrere Ansichten in einer Zeile zusammenzuführen und einzuführen:


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

First Der erste Parameter ist der Name der Ansicht, die für jedes Element im Array oder in der Sammlung gerendert werden muss.

Der zweite Parameter ist ein Array oder eine Sammlung, die zur Bereitstellung der Iteration verwendet wird.

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

你也可以传递第四个参数到 @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 命令来清除。

总结

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Blade-Template-Engine in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn