使用Laravel的刀片模板系统进行适当的可重用子视图

时间:2014-11-23 16:24:27

标签: php laravel blade

我有一个登录表单,我希望在各种上下文中重用。例如,我想要一个只有登录页面(www.mysite.com/login),但也想在我的首页(wwww.mysite.com)上使用登录表单。

Laravel的文档提出了以下方法来为用户配置文件使用子视图。

<!-- Stored in app/controllers/UserController.php -->

class UserController extends BaseController {

    /**
     * The layout that should be used for responses.
     */
    protected $layout = 'layouts.master';

    /**
     * Show the user profile.
     */
    public function showProfile()
    {
        $this->layout->content = View::make('user.profile');
    }

}

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

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

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

<!-- Stored in app/views/user/profile.blade.php -->

@extends('layouts.master')

@section('sidebar')
    <p>This is appended to the master sidebar.</p>
@stop

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

问题是子视图被“污染”,代码使其成为layouts.master视图的子代。由于我希望我的登录表单可以在各种布局中重复使用,因此我不希望任何对应该使用它的特定布局的引用。

我想我可以在视图中将其称为视图变量:

{{ $login }}

然后用这样的控制器实现它:

$this->someview->login = View::make('user.login');

我的登录视图因此可以是纯粹的:

 <!-- Stored in app/views/user/login.php -->

<form method="post" action="{{ URL::to('/') }}/login" accept-charset="utf-8">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <fieldset>
        <legend>credentials</legend>
        <label>
            <span>email</span>
            <input name="email" type="email" placeholder="yourname@email.com" tabindex="1" required autofocus>
        </label>
        <label>
            <span>password</span>
            <input name="password" type="password" placeholder="password" tabindex="2" required>
        </label>
    </fieldset>
    <input type="submit" value="login">
</form>

这是插入子视图而不对应该使用它的布局进行硬编码的最佳方法吗?

我必须说实话,我可以看到为特定视图定义布局的能力,因为它提供了加载视图的可能性,系统自动找到布局,但这不符合干编码的概念吗?

1 个答案:

答案 0 :(得分:3)

您可以使用刀片@include语法任何视图包含到另一个视图中。 Laravel docs(你必须向下滚动一下)

@include('user.login')

如果需要,您还可以传递参数......

@include('user.login', array('foo' => 'bar'))

...然后可以在包含的视图中作为变量访问

{{ $foo }}

更新

例如,对于您的登录页面,您将创建一个login.blade.php。 (并且我将包含该表单的登录子视图放在子目录中。例如partials

@extends('layouts.master')

@section('content')
    @include('partials.login')
@stop

在您的控制器操作中,您只需返回登录(页面)视图

return View::make('login'); // NOT partials.login

对于需要登录表单的其他页面,只需执行确切的操作。