Если вы посмотрите на официальную документацию 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
раздела. Но на самом деле, если вы попробуете, это не добавляет, он просто переопределяет содержимое из расширенного шаблона.
Я слышал о других функциях лезвия, таких как @append, @prepend, @parent
… никто, кажется, не работает.
Кроме того, этот пример в официальном документе, который не работает, я считаю, что документация на blade-серверу очень плохая. Например, нет ничего о функции лезвия, например, @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
См. Здесь .
Чтобы понять, как это работает …
Метод compileStatements()
в BladeCompiler вызывает метод 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>
включает / 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 будет отображаться следующим образом:
Мой блог | Мой Заголовок сообщения
На самом деле это будет выглядеть примерно так:
<title> My Blog | My Post Title </title>
поэтому вы можете использовать второй параметр раздела для установки значений:
включает / 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.