laravel公式ドキュメント http://laravel.com/docs/4.2/templates
<!-- Stored in app/views/layouts/master.blade.php -->
<html>
<body>
@section('sidebar')
This is the master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
このビューで拡張
@extends('layouts.master')
@section('sidebar')
<p>This is appended to the master sidebar.</p>
@stop
@section('content')
<p>This is my body content.</p>
@stop
セクションに追加しますsidebar
。しかし、実際に追加しようとしない場合は、拡張テンプレートのコンテンツをoverrideだけです。
@append, @prepend, @parent
のような他のブレード機能について聞いた...誰も機能していないようだ。
公式ドキュメントのこの例は機能しませんが、ブレードのドキュメントは非常に貧弱です。たとえば@parent
のようなブレード機能については何もありません。
Larvelウェブサイトのドキュメント の例は確かに欠陥があるようですが、ウェブサイトのマークダウン解析の問題だと思います githubの同じドキュメント は正しいコードを示しています:
いかなる場合でも @parent
は確かに機能します。ドキュメントの例は次のようになります。
@extends('layouts.master')
@section('sidebar')
@parent
<p>This is appended to the master sidebar.</p>
@stop
@section('content')
<p>This is my body content.</p>
@stop
Illuminate/View/Factory.php
確認内容@parent
は:
/**
* Append content to a given section.
*
* @param string $section
* @param string $content
* @return void
*/
protected function extendSection($section, $content)
{
if (isset($this->sections[$section]))
{
$content = str_replace('@parent', $content, $this->sections[$section]);
}
$this->sections[$section] = $content;
}
単純に_@append
_...を使用できます。
_@extends('layouts.master')
@section('sidebar')
<p>This is appended to the master sidebar.</p>
@append
@section('content')
<p>This is my body content.</p>
@stop
_
こちらを参照 。
この仕組みを理解するには...
BladeCompilerのcompileStatements()
メソッドは、次のようにcompileAppend()
メソッドを呼び出します。
_/**
* Compile Blade Statements that start with "@"
*
* @param string $value
* @return mixed
*/
protected function compileStatements($value)
{
$callback = function($match)
{
if (method_exists($this, $method = 'compile'.ucfirst($match[1])))
{
$match[0] = $this->$method(array_get($match, 3));
}
return isset($match[3]) ? $match[0] : $match[0].$match[2];
};
return preg_replace_callback('/\B@(\w+)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x', $callback, $value);
}
_
次に、次のようなappendSection()
の呼び出しを挿入します。
_/**
* Stop injecting content into a section and append it.
*
* @return string
*/
public function appendSection()
{
$last = array_pop($this->sectionStack);
if (isset($this->sections[$last]))
{
$this->sections[$last] .= ob_get_clean();
}
else
{
$this->sections[$last] = ob_get_clean();
}
return $last;
}
_
前述したように、@parent
そしてそれは私のためにうまく動作します。拡張title
の例が役立つ場合があります。
master.blade.php
@section('title')
My Blog
@stop
<!doctype html>
<html>
<head>
@include('includes.head')
</head>
<body>
<div class="container-fluid">
<div id="main" class="row">
@yield('content')
</div>
</div>
</body>
</html>
includes/head.blade.php
<meta charset="utf-8">
<title>@yield('title')</title>
post.blade.php
@extends('master')
@section('title')
@parent
| {{$post->title }}
@stop
@section('content')
// Post Body here ..
@stop
したがって、タイトルは次のようにレンダリングされます。
私のブログ|私の投稿タイトル
実際、これは次のようにレンダリングされます。
<title>
My Blog
| My Post Title
</title>
したがって、セクションの2番目のパラメーターを使用して値を設定できます。
includes/head.blade.php
...
@section('title', 'My Blog')
...
post.blade.php
...
@section('title', '@parent | ' . $post->ar_name )
...
そして、これはレンダリングされます:
<title>My Blog | My Post Title</title>
したがって、タイトル内の行を削除し、
それがお役に立てば幸いです。
注:これはLaravel 5.2、よくわからないが、覚えているように、Laravel 4でも機能する。