我有一个登录表单,我希望在各种上下文中重用。例如,我想要一个只有登录页面(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>
这是插入子视图而不对应该使用它的布局进行硬编码的最佳方法吗?
我必须说实话,我可以看到为特定视图定义布局的能力,因为它提供了加载视图的可能性,系统自动找到布局,但这不符合干编码的概念吗?
答案 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
对于需要登录表单的其他页面,只需执行确切的操作。