web-dev-qa-db-ja.com

laravelブレード、セクションに追加する方法

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のようなブレード機能については何もありません。

28
Amaynut

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;
}
47
Bogdan

単純に_@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;
}
_
20
user1960364

前述したように、@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でも機能する。

1
Mohannad Najjar