如何在Laravel的Blade模板中传递变量到布局?

115

在 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变量传递到视图的内容部分。我如何将该变量提供给整个视图,或者至少是主布局?

12个回答

258

如果你在内容布局中使用了@extends,你可以使用以下代码:

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

请注意:与上面相同的方法也适用于子元素,例如:

@include('views.subView', ['my_variable' => 'my-value'])

使用方法

然后将变量传递到需要使用的地方,例如:

<title>{{ $title ?? 'Default Title' }}</title>

2
我花了很多时间在谷歌上搜索才找到这个!你必须完美掌握这个语法,而文档并没有展示所有这些微妙之处。我的意思是官方文档中写的是 @component('alert', ['foo' => 'bar'])...... - Arthur Tarasov
我正在做这个,但在布局页面上出现了未定义的错误。有什么想法吗? - LucyTurtle
@LucyTurtle请参阅使用部分(提供默认值,例如:{{ $title ?? '我的默认标题' }} - Top-Master

51

对于将来使用 Laravel 5 的 Google 用户,现在也可以使用它与 includes 相结合。

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

这就是我期待已久的,终于能够在 Laravel 上创建基于组件的应用程序了,谢谢! - Ron Michael
如果我只传递了 ["one"],我该如何在模板中获取它? - Javier J Solis Flores

23

在 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中使用它,效果很棒..感谢您的答案... - Saiyan Prince
3
我需要做的是:{{ $title ?? '默认标题' }} - Damien

20

我通过将以下内容添加到我的控制器方法中解决了那个问题:

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

$this->layout->title = 'Home page';也没有起作用。


这在laravel 5.1中对我有效。解决问题的最简单方法。 - chuysbz

6

解决问题的最简单方法:

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

或者使用视图Facade:

use View;

...

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

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

4

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

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

8
这对我没用。我现在收到一个错误,指出它不被视为变量存在。 - Adam Libonatti-Roche
我在哪里可以找到布局对象? - Yevgeniy Afanasyev

1
以下是对我有效的简单解决方案。
In layout

    <title>@yield('Page-Title') </title>


In your blade file 

@section('Page-Title')
My Page Title
@endsection 

它在我基于 Laravel 8 的项目中运行良好,非常感谢。 - Hassan Ashraf

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

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

在 Blade 模板文件中,请记得在变量前面使用 @ 符号。
...
<title>{{ $title or '' }}</title>
...
@yield('content')
...

@YevgeniyAfanasyev,这个问题你应该向帖子所有者询问。我只是参考他的代码。你向我反问有点奇怪...而且这个问题已经在2014年得到了回答。当然,我是指他所询问的版本,即Laravel 4。 - Shiro

1
如果您想获取部分变量,可以按照以下方式支付:
$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/

1

尝试这个简单的方法: 在控制器中:

 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>

就这些。


你能解释一下这是如何解决问题的吗?它相比之前的答案(尤其是已被接受的答案)有什么新的贡献? - gstukelj
欢迎来到SO!当您提供答案时,即使它是正确的,您也应该稍微解释一下,并且在您的情况下,由于有一个类似的答案,请尝试解释您的答案的优缺点。 - David García Bodego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接