Laravel 4 Controller Templating / Blade - Correct

2019-03-09 09:36发布

问题:

I've been reading through the Laravel 4 documentation and have been making a demo application to help with learning.

I couldn't find much documentation on the templating of views with blade and controllers. Which is the correct method or does it come down to personal preference?

E.g. 1

Controllers/HomeController.php

protected $layout = 'layouts.main';

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

Views/layouts/main.blade.php

<html>
<head>
    <title>{{ $title }}</title>
</head>
<body>
    {{ $content }}
</body>
</html>

Views/welcome.blade.php

<p>Welcome.</p>

E.g. 2

Controllers/HomeController.php

protected $layout = 'layouts.main';

public function showWelcome()
{
    $this->layout->content = View::make('welcome');
}

Views/layouts/main.blade.php

<html>
<head>
    <title>@yield('title')</title>
</head>
<body>
    @yield('content')
</body>
</html>

Views/welcome.blade.php

@section('title', 'Welcome')
@section('content')
// content
@stop

What is the best convention and/or advantages of the the above?

回答1:

I don't store any layout information in the controller, I store it in the view via

@extends('layouts.master')

When I need to return a view in the controller I use:

return \View::make('examples.foo')->with('foo', $bar);

I prefer this approach as the view determines what layout to use and not the controller - which is subject to re-factoring.



回答2:

I don't like either of them. Layouts are probably the weirdest part of Laravel. The controller version doesn't really make sense; all methods of the controller then require that view. The @yield version is a mess of boilerplate. I made up this "method specific layouts":

public function index()
{
    return View::make('layouts.main', [
        'layout_data' => 'sup'
    ])->nest('content', 'welcome', [
        'view_data' => 'sup'
    ]);
}

I think it should be mentioned in the docs that this is an option.



回答3:

I prefere the second one, because it shows a more clear separation between your view and controller code. It seems more logical to me that title would be a property of a content view instead of combining your welcome view with your welcome title each time.

In the end both are correct and will work, but the second alternative is more maintainable.



回答4:

I prefer the 1st method since some sites have a dynamically generated title from the database. It's easy to pass the title in using the first method.