【问题标题】:How do I pass a variable to the layout using Laravel' Blade templating?如何使用 Laravel 的 Blade 模板将变量传递给布局?
【发布时间】:2013-04-13 15:25:38
【问题描述】:

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

【问题讨论】:

    标签: laravel laravel-4 blade


    【解决方案1】:

    如果您在内容布局中使用@extends,则可以使用:

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

    注意上面的同样适用于儿童,例如:

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

    用法

    然后将变量传递到哪里,像这样使用它:

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

    【讨论】:

    • 我花了很多时间在谷歌上搜索才找到这个!正是这种语法才能让您变得完美,而文档并没有显示所有这些微妙之处。我的意思是这是官方文档所说的@component('alert', ['foo' =&gt; 'bar'])......
    • 我正在执行此操作,但在布局页面上出现未定义错误。有什么想法吗?
    • @LucyTurtle 查看用法部分(提供默认值,例如:{{ $title ?? 'My Default Title' }}
    【解决方案2】:

    对于未来使用 Laravel 5 的 Google 员工,您现在也可以将它与包含一起使用,

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

    【讨论】:

    • 这就是我在 laravel 上最终创建基于组件的应用程序所要寻找的,谢谢!
    • 如果我只传["one"],如何在模板中获取?
    【解决方案3】:

    在 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 中使用它,效果很好。感谢您的回答...
    • 我必须这样做:{{ $title ?? 'Default Title' }}
    【解决方案4】:

    我可以通过将它添加到我的控制器方法来解决这个问题:

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

    $this->layout->title = '主页';也没有用。

    【讨论】:

    • 这在 laravel 5.1 中对我有用。解决问题的最简单方法。
    【解决方案5】:

    最简单的解决方法:

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

    或使用视图外观:

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

    【讨论】:

    • 我可以在路由中间件中执行吗?
    【解决方案6】:

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

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

    【讨论】:

    • 这对我不起作用。我目前收到一条错误消息,指出它不作为变量存在。
    • 在哪里可以找到布局对象?
    【解决方案7】:
    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。
    【解决方案8】:

    如果你想获取section的变量,你可以这样付费:

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

    【讨论】:

      【解决方案9】:

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

       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>
      

      仅此而已。

      【讨论】:

      • 您能解释一下这是如何解决问题的吗?除了之前的(特别是公认的)答案之外,它还有什么新的贡献?
      • 欢迎来到 SO!当你给出一个答案时,即使它是好的,你也应该稍微解释一下,在你的情况下,有一个类似的,试着解释一下你的答案的利弊。
      【解决方案10】:

      以下是对我有用的简单解决方案。 在布局中

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

      在你的刀片中

      @section('Page-Title')
      Add {{ucFirst($payor->name)}}
      @endsection 
      

      【讨论】:

        【解决方案11】:

        你可以试试:

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

        【讨论】:

          【解决方案12】:
          $data['title'] = $this->layout->title = 'The Home Page';
          $this->layout->content = View::make('home', $data);
          

          到目前为止,我已经这样做了,因为我需要在视图和主文件中。似乎如果您不使用 $this->layout->title 它在​​主布局中将不可用。欢迎改进!

          【讨论】:

            猜你喜欢
            • 2021-09-06
            • 2015-07-16
            • 1970-01-01
            • 2014-05-22
            • 1970-01-01
            • 2014-05-06
            • 2016-04-12
            • 2022-06-30
            • 1970-01-01
            相关资源
            最近更新 更多