>PHP 프레임워크 >Laravel >블레이드 템플릿이란 무엇입니까?

블레이드 템플릿이란 무엇입니까?

coldplay.xixi
coldplay.xixi원래의
2020-07-02 10:55:483352검색

Blade 템플릿은 Laravel에서 제공하는 템플릿 엔진입니다. 블레이드는 뷰에서 기본 PHP 코드를 사용할 수 있도록 하므로 애플리케이션에서는 블레이드가 사용되지 않습니다. 간접비.

블레이드 템플릿이란 무엇입니까?

Blade 템플릿은 다음과 같습니다.

Blade는 Laravel에서 제공하는 템플릿 엔진으로 간단하고 강력합니다. 다른 PHP 템플릿 엔진과 달리 Blade에서는 보기에서 기본 PHP 코드를 사용할 수 있습니다.

사실 모든 블레이드 뷰는 결국 기본 PHP 코드로 컴파일되어 storage/framework/views 폴더에 캐시됩니다. storage/framework/views 文件夹中。

Laravel 使用的是这些编译后的缓存文件,而不是视图本身,所以,Blade 对于应用程序来说是零开销的。当你修改了视图文件,那么它会重新编译并缓存,以便使用。Blade 视图以 blade.php 为后缀名,一般存放于 resources/views 文件夹中。

模板继承:

1、定义布局文件

Blade 模板引擎的主要两个优点是 “模板继承” 和 “区块”。举一个简单的例子,一个项目里,几乎所有的页面都是一样的布局,这时候就可以把这个布局提炼出来,作为母版页,继承了这个母版页的的页面都有一样的布局效果,成为母版页的子页。母版页还叫布局文件,布局文件就是一个 Blade 视图:

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

布局文件里除了基础的 HTNL 标签,还使用了两个指令:@section 和 @yield 。@section定义区块,@yield 定义区块里的内容。

下面。来定义布局文件的子页。

2、继承布局文件

子页中,使用 Blade 的 @extends 指令指定 “继承” 的布局文件,使用 @section 指令为在布局文件中使用 @section 和 @yield 指令的地方注入内容:

<!-- Stored in resources/views/child.blade.php -->
@extends(&#39;layouts.app&#39;)
@section(&#39;title&#39;,&#39;Page Title&#39;)
@section(&#39;sidebar&#39;)
       <p> This is appended to the master sideebar</p>
@endsection
@section(&#39;content&#39;)
         <p>This ismy body content. </p>
@endsection

可以看到,在布局文件中使用 @yield 指令的地方,在子页中仍然使用 @section 注入内容;在布局文件中使用 @section 指令定义的一个好处是:在子页中使用 @section 注入时,可以使用 @parent 指令附加(而非重写)在布局文件中的内容,而在布局文件中使用 @yield 指令定义的地方是做不到的。@parent 指令会在视图渲染的时替换成布局文件里的内容。

注意,与在文件布局里定义的 sidebar 不同的是,子页里使用 @endsection 结束,而非 @show 。因为 @endsection 仅用来定义区块,而 @show 是用来定义、立马产出区块的。

从路由中直接返回视图文件,要用到全局辅助函数 helper :

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

3、组件&插槽

组件和插槽提供了类似布局和区块的优点。而组件和插槽的心智模型更符合直觉。设想一下,在我们的项目中有一个可重复的 “弹框” 组件:

<!-- Stored resource/views/alter.blade.php -->
<div class="alter alter-danger">
       {{ $slot }}
</div>

{{ $slot }} 表示插入组建的内容。构建此组件,是使用 Blade 的@component指令:

@component(&#39;alter&#39;)
        <strong>Whoops!</strong> Something went wrong!
@endcomponent

在这个场景里,{{ $slot }} 变量的内容是:

<strong>Whoops! </strong> Something went wrong!

有时一个组件需要多个插槽。这时,只需要稍改组件代码,定义一个 “标题” 插槽,这个插槽称命名插槽。命名插槽是通过简单的 “打印” 匹配其名称的变量来显示内容的:

<!-- Stored resources/views/alter.blade.php-->
<div class="alter alter-danger">
         <div class="alter-title">{{ $title }}</div>
            {{ $slot }}
</div>

为名名插槽注入内容,使用 @slot 指令。所有不在 @slot 指令里的内容都会传递给组件里的 $slot 变量。

@compontent (&#39;alter&#39;)
         @slot(&#39;title&#39;)
            Forbidden
         @endslot
     You are not allowed to access this resource!
@edcompontent~

4、为组建传递额外数据:

有时需要为组建件递额外数据。为此,可以为 @conponent 指令传递第二个数组参数。指定要传递的额外。据所有过去的额外数据作为变量,在组件模板里都可以取的:

@component
     <compontent(&#39;alter&#39;, [&#39;foo&#39; => &#39;bar&#39;);
         .....
@endCompontent

5、显示数据

向 Blade 视图传递数据,是通过将变量包裹在 [ ] 里实现的:

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

下面就可以使用 name 变量显示内容了:

Hello! {{ $name }}

{{ }} 是 Blade 视图的打印语句,当然,打印语句里不限制只能打印变量内容,也可以使用 PHP 函数。实际上,打印语句这里可以使用任何 PHP 代码:

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

6、显示非转移数据

默认,所有传递给 Blade {{ }} 语句的内容都会使用 htmlspecialchar 函数处理、将内容转义,避免 XSS 攻击。如果无需转义输出的内容,可以使用下面语法:

Hello! {{!! $name !!}}.

不过千万要小心,应该优先选择使用转义的 {{ }}

Laravel은 뷰 자체가 아닌 이러한 컴파일된 캐시 파일을 사용하므로 Blade는 애플리케이션에 대한 오버헤드가 없습니다. 뷰 파일을 수정하면 사용을 위해 다시 컴파일되고 캐시됩니다. 블레이드 보기에는 Blade.php 라는 접미사 이름이 있으며 일반적으로 resources/views 폴더에 저장됩니다.

템플릿 상속:

1. 레이아웃 파일 정의🎜🎜🎜블레이드 템플릿 엔진의 주요 두 가지 장점은 "템플릿 상속"과 "블록"입니다. 간단한 예를 들자면, 프로젝트에서는 거의 모든 페이지가 동일한 레이아웃을 가지고 있으며 이때 이 레이아웃을 추출하여 마스터 페이지로 사용할 수 있습니다. 이 마스터 페이지를 상속받은 모든 페이지는 동일한 레이아웃 효과를 갖게 됩니다. 마스터 페이지의 하위 페이지입니다. 마스터 페이지는 레이아웃 파일이라고도 하며 레이아웃 파일은 블레이드 보기입니다. 🎜rrreee🎜 기본 HTNL 태그 외에도 레이아웃 파일은 @section 및 @yield라는 두 가지 명령도 사용합니다. @section은 블록을 정의하고 @yield는 블록의 내용을 정의합니다. 🎜🎜아래. 레이아웃 파일의 하위 페이지를 정의합니다. 🎜🎜🎜2. 레이아웃 파일 상속🎜🎜🎜하위 페이지에서 블레이드의 @extends 지시문을 사용하여 "상속된" 레이아웃 파일을 지정하고, @section 지시문을 사용하여 @section 및 @yield가 있는 레이아웃 파일에 콘텐츠를 삽입합니다. 🎜rrreee🎜 레이아웃 파일에서 @yield 지시문이 사용되는 경우 @section은 여전히 ​​하위 페이지에 콘텐츠를 삽입하는 데 사용됩니다. 레이아웃 파일에서 @section 지시문 정의를 사용하면 다음과 같은 이점이 있습니다. 하위 페이지에서 @section 사용 주입 시 @parent 지시문을 사용하여 레이아웃 파일의 콘텐츠를 추가(덮어쓰는 대신)할 수 있는데, 이는 @yield 지시문을 사용하여 정의된 레이아웃 파일에서는 불가능합니다. @parent 지시문은 뷰가 렌더링될 때 레이아웃 파일의 콘텐츠로 대체됩니다. 🎜🎜 파일 레이아웃에 정의된 사이드바와는 달리 서브페이지는 @show 대신 @endsection으로 끝나는 점 참고하세요. @endsection은 블록을 정의하는 데만 사용되고, @show는 블록을 정의하고 즉시 생성하는 데 사용되기 때문입니다. 🎜🎜경로에서 직접 보기 파일을 반환하려면 전역 도우미 함수 도우미를 사용하세요:🎜rrreee🎜🎜3. 구성 요소 및 슬롯🎜🎜🎜구성 요소와 슬롯은 레이아웃 및 블록과 유사한 이점을 제공합니다. 구성 요소와 슬롯의 정신 모델이 더 직관적입니다. 프로젝트에 반복 가능한 "팝업 상자" 구성 요소가 있다고 가정해 보겠습니다. 🎜rrreee🎜{{ $slot }}는 삽입된 구성 요소의 콘텐츠를 나타냅니다. 이 구성 요소를 빌드하려면 Blade의 @comComponent 지시문을 사용하세요. 🎜rrreee🎜이 시나리오에서 {{ $slot }} 변수의 내용은 다음과 같습니다. 🎜rrreee🎜구성 요소에 여러 슬롯이 필요한 경우가 있습니다. 이때 구성 요소 코드를 약간 변경하고 명명된 슬롯이라고 하는 "제목" 슬롯을 정의하기만 하면 됩니다. 이름이 지정된 슬롯은 이름과 일치하는 변수를 간단히 "인쇄"하여 콘텐츠를 표시합니다. 🎜rrreee🎜 이름이 지정된 슬롯에 콘텐츠를 삽입하려면 @slot 지시문을 사용하세요. @slot 지시어에 없는 모든 콘텐츠는 구성 요소의 $slot 변수로 전달됩니다. 🎜rrreee🎜🎜4. 구성 요소에 대한 추가 데이터 전달: 🎜🎜🎜때로는 구성 요소에 대한 추가 데이터를 전달해야 합니다. 이렇게 하려면 @conComponent 지시문에 두 번째 배열 인수를 전달할 수 있습니다. 전달될 추가 항목을 지정합니다. 이전의 모든 추가 데이터는 구성 요소 템플릿의 변수로 사용할 수 있습니다: 🎜rrreee🎜🎜5. 데이터 표시 🎜🎜🎜 [ ] 의 변수를 래핑하여 데이터를 블레이드 보기로 전송합니다. 구현 위치: 🎜rrreee🎜 이제 name 변수를 사용하여 내용을 표시할 수 있습니다. 🎜rrreee🎜{{ }} 는 블레이드 보기의 인쇄 문입니다. 물론 인쇄 문은 변수 내용을 인쇄하는 것으로 제한되지 않습니다. , PHP 함수를 사용할 수도 있습니다. 실제로 여기에서는 인쇄 문에 모든 PHP 코드를 사용할 수 있습니다. 🎜rrreee🎜🎜6. 전송되지 않은 데이터 표시 🎜🎜🎜기본적으로 모든 콘텐츠는 Blade {{ }} 문에 전달됩니다. XSS 공격을 피하기 위해 htmlspecialchar 함수를 사용하여 콘텐츠를 처리하고 이스케이프합니다. 출력 콘텐츠를 이스케이프할 필요가 없는 경우 다음 구문을 사용할 수 있습니다. 🎜rrreee🎜그러나 주의해야 할 점은 이스케이프된 {{ }} 구문을 사용하여 XXS 공격을 방지하는 데 우선순위를 두어야 한다는 것입니다. 때로는 사용자가 의도적이거나 의도하지 않은 데이터 입력을 피하는 것이 어렵기 때문입니다. 🎜🎜🎜관련 학습 권장사항: 🎜Laravel🎜🎜🎜🎜

위 내용은 블레이드 템플릿이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.