如何使用Laravel的Blade模板将变量传递到布局?


91

在Laravel 4中,我的控制器使用Blade布局:

class PagesController extends BaseController {
    protected $layout = 'layouts.master';
}

主布局输出变量标题,然后显示一个视图:

...
<title>{{ $title }}</title>
...
@yield('content')
....

但是,在我的控制器中,我似乎只能将变量传递给子视图,而不是布局。例如,一个动作可以是:

public function index()
{
    $this->layout->content = View::make('pages/index', array('title' => 'Home page'));
}

这只会将$title变量传递到视图的内容部分。如何将变量提供给整个视图,或者至少提供给主布局?

Answers:


217

如果要@extends在内容布局中使用,可以使用以下方法:

@extends('master', ['title' => $title])

1
我花了很多时间来寻找这个!正是这种语法使您变得完美,而文档并没有显示所有这些细微之处。我的意思是这是官方文档所说的@component('alert', ['foo' => 'bar'])……
Arthur Tarasov

我正在这样做,并且在布局页面上收到未定义的错误。有任何想法吗?
LucyTurtle

45

对于将来使用Laravel 5的Google员工,您现在还可以将其与包含,

@include('views.otherView', ['variable' => 1])

我正在寻找最终在laravel上创建基于组件的应用程序的东西,谢谢!
罗恩·迈克尔

如果我仅通过[“ one”],如何在模板中获取它?
哈维尔·索利斯·弗洛雷斯

20

通过将其添加到控制器方法中,我能够解决该问题:

    $title = 'My Title Here';
    View::share('title', $title);

$ this-> layout-> title ='主页'; 也不起作用。


这在laravel 5.1中对我有用。解决问题的最简单方法。
CodeChuck

16

在Blade模板中:定义一个这样的变量

@extends('app',['title' => 'Your Title Goes Here'])
@section('content')

并在app.blade.php或您选择的任何其他选项中(我只是遵循默认的Laravel 5设置)

<title>{{ $title or 'Default title Information if not set explicitly' }}</title>

这是我的第一个答案。希望它有用。祝你好运!


这帮助我节省了几个小时..!在Laravel 5.4中使用了它,并且效果很好。。感谢您的回答……
赛亚人王子

2
我必须做:{{ $title ?? 'Default Title' }}
DamienÓCeallaigh,

5

最简单的解决方法:

view()->share('title', 'My Title Here');

或使用视图外观:

use View;

...

View::share('title', 'My Title Here');

我可以在路由中间件中执行它吗?
mukade '18

4

看来我可以使用布局对象上的属性将变量传递给整个布局,例如,为了解决我的问题,我能够执行以下操作:

$this->layout->title = 'Home page';

8
这对我不起作用。我目前收到一条错误消息,指出它不作为变量存在。
亚当·利伯纳蒂·罗奇

在哪里可以找到布局对象?
Yevgeniy Afanasyev

1
class PagesController extends BaseController {
    protected $layout = 'layouts.master';

    public function index()
    {
        $this->layout->title = "Home page";
        $this->layout->content = View::make('pages/index');
    }
}

在刀片模板文件中,记住要在变量前面使用@。

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...

@YevgeniyAfanasyev,这个问题你应该问回帖子所有者。我只是参考他的编码。有点怪异的问题,你想问我。...这在2014年得到了回答。当然,我指的是他问的版本是Laravel4。–
Shiro

0

你可以试试:

public function index()
{
    return View::make('pages/index', array('title' => 'Home page'));
}

0

只需尝试以下简单方法:在控制器中:-

 public function index()
   {
        $data = array(
            'title' => 'Home',
            'otherData' => 'Data Here'
        );
        return view('front.landing')->with($data);
   }

并在您的布局(app.blade.php)中:

<title>{{ $title }} - {{ config('app.name') }} </title>

就这样。


您能解释一下这是如何解决问题的吗?除了以前的(特别是公认的)答案以外,它还有什么新的贡献?
gst,

欢迎来到SO!当您给出答案时,即使可以,也应稍作解释,就您的情况而言,因为有类似的答案,请尝试说明答案的利弊。
大卫·加西亚·博德戈(DavidGarcíaBodego),

0

如果要获取各部分的变量,可以按以下方式支付:

$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/

-2
$data['title'] = $this->layout->title = 'The Home Page';
$this->layout->content = View::make('home', $data);

到目前为止,我已经完成了此操作,因为我需要视图和主文件。看来,如果您不使用$ this-> layout-> title,它将不会在主版面中使用。欢迎改进!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.