Skip to content

视图与响应

基本响应

从路由返回字符串

php
Route::get('/', function()
{
	return '你好,世界';
});

创建自定义响应

Response 实例继承自 Symfony\Component\HttpFoundation\Response 类,提供多种构建 HTTP 响应的方法。

php
$response = Response::make($contents, $statusCode);

$response->header('Content-Type', $value);

return $response;

如果您需要访问 Response 类的方法,但想将视图作为响应内容返回,可以使用 Response::view 方法以方便:

php
return Response::view('hello')->header('Content-Type', $type);

向响应附加 Cookies

php
$cookie = Cookie::make('name', 'value');

return Response::make($content)->withCookie($cookie);

重定向

返回重定向

php
return Redirect::to('user/login');

返回带有闪存数据的重定向

php
return Redirect::to('user/login')->with('message', '登录失败');
lightbulb

由于 with 方法将数据闪存到会话中,您可以使用典型的 Session::get 方法来检索数据。

返回到命名路由的重定向

php
return Redirect::route('login');

返回到带参数的命名路由的重定向

php
return Redirect::route('profile', array(1));

返回到使用命名参数的命名路由的重定向

php
return Redirect::route('profile', array('user' => 1));

返回到控制器动作的重定向

php
return Redirect::action('HomeController@index');

返回到带参数的控制器动作的重定向

php
return Redirect::action('UserController@profile', array(1));

返回到使用命名参数的控制器动作的重定向

php
return Redirect::action('UserController@profile', array('user' => 1));

视图

视图通常包含您应用程序的 HTML,并提供了一种方便的方式来将控制器和领域逻辑与展示逻辑分开。视图存储在 app/views 目录中。

一个简单的视图可能看起来像这样:

php
<!-- 存储在 app/views/greeting.php 的视图 -->

<html>
	<body>
		<h1>你好,<?php echo $name; ?></h1>
	</body>
</html>

这个视图可以这样返回给浏览器:

php
Route::get('/', function()
{
	return View::make('greeting', array('name' => 'Taylor'));
});

传递给 View::make 的第二个参数是一个数组,包含应提供给视图的数据。

向视图传递数据

php
// 使用常规方法
$view = View::make('greeting')->with('name', 'Steve');

// 使用魔术方法
$view = View::make('greeting')->withName('steve');

在上面的示例中,变量 $name 将在视图中可用,并将包含 Steve

如果您愿意,可以将数据数组作为第二个参数传递给 make 方法:

php
$view = View::make('greetings', $data);

您还可以在所有视图中共享一段数据:

php
View::share('name', 'Steve');

向视图传递子视图

有时您可能希望将一个视图传递给另一个视图。例如,给定存储在 app/views/child/view.php 的子视图,我们可以这样将其传递给另一个视图:

php
$view = View::make('greeting')->nest('child', 'child.view');

$view = View::make('greeting')->nest('child', 'child.view', $data);

子视图可以从父视图中渲染:

php
<html>
	<body>
		<h1>你好!</h1>
		<?php echo $child; ?>
	</body>
</html>

确定视图是否存在

如果您需要检查视图是否存在,请使用 View::exists 方法:

php
if (View::exists('emails.customer'))
{
	//
}

视图组合器

视图组合器是回调或类方法,在渲染视图时被调用。如果您有数据希望在每次渲染该视图时绑定到该视图,视图组合器可以将代码组织到一个单一的位置。因此,视图组合器可以像“视图模型”或“呈现器”一样工作。

定义视图组合器

php
View::composer('profile', function($view)
{
	$view->with('count', User::count());
});

现在每次渲染 profile 视图时,count 数据将绑定到视图。

您还可以将视图组合器附加到多个视图:

php
View::composer(array('profile','dashboard'), function($view)
{
    $view->with('count', User::count());
});

如果您更愿意使用基于类的组合器,这将提供通过应用程序 IoC 容器 解析的好处,您可以这样做:

php
View::composer('profile', 'ProfileComposer');

视图组合器类应这样定义:

php
class ProfileComposer {

	public function compose($view)
	{
		$view->with('count', User::count());
	}

}

定义多个组合器

您可以使用 composers 方法同时注册一组组合器:

php
View::composers(array(
	'AdminComposer' => array('admin.index', 'admin.profile'),
	'UserComposer' => 'user',
	'ProductComposer@create' => 'product'
));
lightbulb

对于组合器类的存储没有约定。您可以自由地将它们存储在任何地方,只要它们可以通过您的 composer.json 文件中的指令自动加载。

视图创建器

视图 创建器 的工作方式几乎与视图组合器相同;但是,它们在视图实例化时立即触发。要注册视图创建器,只需使用 creator 方法:

php
View::creator('profile', function($view)
{
	$view->with('count', User::count());
});

特殊响应

创建 JSON 响应

php
return Response::json(array('name' => 'Steve', 'state' => 'CA'));

创建 JSONP 响应

php
return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback'));

创建文件下载响应

php
return Response::download($pathToFile);

return Response::download($pathToFile, $name, $headers);
lightbulb

Symfony HttpFoundation 管理文件下载,要求被下载的文件必须具有 ASCII 文件名。

响应宏

如果您想定义一个可以在多种路由和控制器中重用的自定义响应,可以使用 Response::macro 方法:

php
Response::macro('caps', function($value)
{
	return Response::make(strtoupper($value));
});

macro 函数接受一个名称作为第一个参数,接受一个闭包作为第二个参数。调用 Response 类上的宏名称时,将执行宏的闭包:

php
return Response::caps('foo');

您可以在您的 app/start 文件之一中定义宏。或者,您可以将宏组织到一个单独的文件中,该文件从您的一个 start 文件中包含。