4

我正在尝试将数据注入布局(不是子视图),但我还没有找到任何看起来实用的方法。

这是我目前知道的两种方法来实现这一点。为简单起见,我将注入的数据是页面标题。

方法一

// app/controllers/HomeController.php

protected $layout = 'main';

public function index()
{
    $this->layout->title = 'Page Title';
    $this->layout->content = View::make('home');
}


// app/views/layout.blade.php
...
<title>{{ $title }}</title>
...

方法二

// app/views/home.blade.php
...
@section('title')
    Page Title
@stop
...


// app/views/layout.blade.php

...
<title>@yield('title')</title>
...

再一次,这些方法似乎都不理想,但到目前为止我还没有看到更好的方法。我觉得 Laravel必须有一些内置的方法来处理这个......

4

3 回答 3

1

您可以编辑 BaseController 中的 setupLayout 方法,将数据直接传递给 View::make 调用。

protected function setupLayout()
{
    if(!is_null($this->layout))
    {
        $data = array(
            'title' => 'Page Title'
        );

        $this->layout = View::make($this->layout, $data);
    }
}

或者,您可以更改 setupLayout 方法以访问 $this->layoutData:

protected function setupLayout()
{
    if(!is_null($this->layout))
    {
        $this->layout = View::make($this->layout, $this->layoutData);
    }
}

然后在您的实际控制器中设置以下内容:

$this->layoutData = array('title' => 'Page Title');
于 2013-05-09T20:36:36.800 回答
0

您还可以使用 View 的嵌套 方法...

命名空间: 照亮\查看

位于 Illuminate/View/View.php

nest( string $key, string $view, array $data = array() )
//Add a view instance to the view data.

布局/bluePrint.blade.php

<html>
<div>
 <!--Some nested content goes here -->
{{$nested_content}}
</div>
</html>

表单/loginForm.blade.php

<h2>Login</h2>
{{Form::open(array
    ('route' => $form_route, 'method' => 'POST', 'role'=>'form'))}}

<div class="form-group">
    {{Form::label('username', 'Username', array
        ('class' => 'form-control'))}}
    {{Form::text('username', $value = NULL , array
        ('class' => 'form-control', 'placeholder'=>'Username'))}}
</div>
<div class="form-group">
    {{Form::label('password', 'Password', array
        ('class' => 'form-control'))}}
    {{Form::password('password' , array
        ('class' => 'form-control', 'placeholder'=>'Password'))}}
</div>
<div class="form-group">
    {{Form::submit('GO', array('class'=>'btn btn-default'))}}
</div>
{{Form::close()}}

路由.php

Route::get('test', array('as' => 'test', function() {
    $layout = View::make('layouts.blueprint');
    return $layout->nest('nested_content','forms.loginForm');
}));
于 2014-04-21T19:35:50.880 回答
0

你的意思是这样的吗?

<!--app/views/layouts/master.blade.php-->

<html>
    <head><title>{{ $title }}</title></head>
    <body>
        <ul id="nav">
            @section('sidebar')
                <li>List Item One</li>
            @show
       </ul>

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

控制器:

public function showWelcome()
{
    $data['title'] = 'LaravelFour';
    $data['newItem'] = 'New List Item';
    return View::make('home', $data);
}

这就是home.blade.php,注意@parent哪个将输出,并且中<li>List Item One</li>的变量将被替换为 的值,这意味着{{ $newItem }}home.blade.php$data['newItem']New List Item

<!--app/views/home.blade.php-->

@extends('layouts.master')
@section('sidebar')
    @parent <!--This will represent <li>List Item One</li> -->
    <li>{{ $newItem }}</li> <!--This is new data, will be injected in the layout-->
@stop

@section('content')
    <p>This is my body content.</p>
@stop

布局中的sidebar将是

<li>List Item One</li>
<li>New List Item</li>

我认为,通过这种方式您在主布局中注入新数据,这就是您所说的。你也可以看看View Composers这个答案

于 2013-05-01T01:44:16.547 回答