视图与响应
基本响应
从路由返回字符串
Route::get('/', function()
{
return 'Hello World';
});创建自定义响应
Response 实例继承自 Symfony\Component\HttpFoundation\Response 类,提供了多种方法来构建 HTTP 响应。
$response = Response::make($contents, $statusCode);
$response->header('Content-Type', $value);
return $response;如果你需要访问 Response 类的方法,但希望返回视图作为响应内容,可以使用 Response::view 方法来方便地实现:
return Response::view('hello')->header('Content-Type', $type);附加 Cookie 到响应
$cookie = Cookie::make('name', 'value');
return Response::make($content)->withCookie($cookie);重定向
返回重定向
return Redirect::to('user/login');返回带有闪存数据的重定向
return Redirect::to('user/login')->with('message', 'Login Failed');NOTE
由于 with 方法将数据闪存到会话中,你可以使用典型的 Session::get 方法来检索数据。
返回到命名路由的重定向
return Redirect::route('login');返回带参数的命名路由的重定向
return Redirect::route('profile', array(1));使用命名参数返回到命名路由的重定向
return Redirect::route('profile', array('user' => 1));返回到控制器动作的重定向
return Redirect::action('HomeController@index');返回带参数的控制器动作的重定向
return Redirect::action('UserController@profile', array(1));使用命名参数返回到控制器动作的重定向
return Redirect::action('UserController@profile', array('user' => 1));视图
视图通常包含应用程序的 HTML,并提供了一种将控制器和领域逻辑与表示逻辑分离的便捷方式。视图存储在 app/views 目录中。
一个简单的视图可能如下所示:
<!-- View stored in app/views/greeting.php -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>可以像这样将此视图返回到浏览器:
Route::get('/', function()
{
return View::make('greeting', array('name' => 'Taylor'));
});传递给 View::make 的第二个参数是一个数据数组,这些数据应该在视图中可用。
向视图传递数据
// 使用常规方法
$view = View::make('greeting')->with('name', 'Steve');
// 使用魔术方法
$view = View::make('greeting')->withName('steve');在上面的示例中,变量 $name 可以从视图中访问,并且将包含 Steve。
如果愿意,可以将数据数组作为 make 方法的第二个参数传递:
$view = View::make('greetings', $data);你还可以在所有视图中共享一段数据:
View::share('name', 'Steve');向视图传递子视图
有时你可能希望将一个视图传递到另一个视图中。例如,给定一个存储在 app/views/child/view.php 的子视图,我们可以像这样将其传递到另一个视图中:
$view = View::make('greeting')->nest('child', 'child.view');
$view = View::make('greeting')->nest('child', 'child.view', $data);然后可以从父视图中渲染子视图:
<html>
<body>
<h1>Hello!</h1>
<?php echo $child; ?>
</body>
</html>确定视图是否存在
如果需要检查视图是否存在,请使用 View::exists 方法:
if (View::exists('emails.customer'))
{
//
}视图作曲器
视图作曲器是当视图被渲染时调用的回调或类方法。如果你有数据希望在应用程序中每次渲染视图时绑定到给定视图,视图作曲器可以将该代码组织到一个位置。因此,视图作曲器可以像“视图模型”或“呈现器”一样工作。
定义视图作曲器
View::composer('profile', function($view)
{
$view->with('count', User::count());
});现在每次渲染 profile 视图时,count 数据将绑定到视图。
你还可以一次将视图作曲器附加到多个视图:
View::composer(array('profile','dashboard'), function($view)
{
$view->with('count', User::count());
});如果你更愿意使用基于类的作曲器,它将通过应用程序 IoC 容器 解析提供的好处,你可以这样做:
View::composer('profile', 'ProfileComposer');视图作曲器类应定义如下:
class ProfileComposer {
public function compose($view)
{
$view->with('count', User::count());
}
}定义多个作曲器
你可以使用 composers 方法同时注册一组作曲器:
View::composers(array(
'AdminComposer' => array('admin.index', 'admin.profile'),
'UserComposer' => 'user',
'ProductComposer@create' => 'product'
));NOTE
没有关于作曲器类存储位置的约定。只要它们可以通过 composer.json 文件中的指令自动加载,你可以将它们存储在任何地方。
视图创建者
视图创建者的工作方式几乎与视图作曲器完全相同;然而,它们在视图实例化时立即触发。要注册视图创建者,只需使用 creator 方法:
View::creator('profile', function($view)
{
$view->with('count', User::count());
});特殊响应
创建 JSON 响应
return Response::json(array('name' => 'Steve', 'state' => 'CA'));创建 JSONP 响应
return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback'));创建文件下载响应
return Response::download($pathToFile);
return Response::download($pathToFile, $name, $headers);NOTE
管理文件下载的 Symfony HttpFoundation 要求下载的文件具有 ASCII 文件名。
响应宏
如果你想定义一个可以在各种路由和控制器中重用的自定义响应,可以使用 Response::macro 方法:
Response::macro('caps', function($value)
{
return Response::make(strtoupper($value));
});macro 函数接受一个名称作为第一个参数,一个闭包作为第二个参数。当在 Response 类上调用宏名称时,将执行宏的闭包:
return Response::caps('foo');你可以在 app/start 文件之一中定义你的宏。或者,你可以将宏组织到一个单独的文件中,并从一个 start 文件中包含该文件。