视图和响应

目录

基础介绍

视图包含要发送到客户端的HTML代码. 将视图从业务逻辑中分离会使你的代码更加清晰和易于维护.

所有的视图都包含在application/views文件夹下, 后缀是".php". View类提供了一些简单的方法来检索处理视图并把他们发送到客户端. 让我们来看个例子:

创建一个视图:

<html>
    I'm stored in views/home/index.php!
</html>

从路由中返回视图:

Route::get('/', function()
{
    return View::make('home.index');
});

从控制器中返回视图:

public function action_index()
{
    return View::make('home.index');
});

分析视图是否存在:

$exists = View::exists('home.index');

有时你会需要多一点对发送到浏览器响应的控制. 例如你也许需要设置一个特定的头标识, 或者是改变HTTP状态码. 下面是方法:

返回一个特定的响应:

Route::get('/', function()
{
    $headers = array('foo' => 'bar');

    return Response::make('Hello World!', 200, $headers);
});

返回一个带有视图的特定的响应:

return Response::view('home', 200, $headers);

返回一个基于JSON的响应:

return Response::json(array('name' => 'Batman'));

把一个Eloquent模型作为JSON数据返回:

return Response::eloquent(User::find(1));

绑定数据到视图

通常情况下, 路由或控制器将请求从模型中请求视图需要显示的数据. 因此, 我们需要一种方式来传递数据到视图. 有几种方法来做到这一点, 所以挑你最喜欢的方式!

绑定数据到一个视图

Route::get('/', function()
{
    return View::make('home')->with('name', 'James');
});

在视图中访问绑定的数据:

<html>
    Hello, <?php echo $name; ?>.
</html>

链式的绑定数据到一个视图:

View::make('home')
    ->with('name', 'James')
    ->with('votes', 25);

把数组作为绑定数据传入:

View::make('home', array('name' => 'James'));

通过属性方法绑定数据:

$view->name  = 'James';
$view->email = 'example@example.com';

通过数组访问接口绑定数据:

$view['name']  = 'James';
$view['email'] = 'example@example.com';

视图嵌套

经常的我们会想用视图嵌套包含视图. 嵌套视图通常被叫做"局部模板(partials)", 帮助你保持视图的小巧性和模块化.

通过"nest"方法绑定嵌套视图:

View::make('home')->nest('footer', 'partials.footer');

向嵌套视图传递数据:

$view = View::make('home');

$view->nest('content', 'orders', array('orders' => $orders));

有时有你想直接的在视图中包含另一个视图, 你可以调用render这一帮助函数来实现:

利用"render"函数来展现一个视图:

<div class="content">
    <?php echo render('user.profile'); ?>
</div>

让部分视图负责显示数据列表也是很常见的功能. 例如你可能会创建一个视图专门用来展示订单信息. 然后通过订单数组的形式循环引用输出. 通过render_each方法可以简单的实现:

数组的每一项上呈现指定的局部视图:

<div class="orders">
    <?php echo render_each('partials.order', $orders, 'order');
</div>

第一个参数是局部视图的名称, 第二个参数是数组数据, 第三个参数是数组中的每一项传递到局部视同中所使用的名字.

基于名字的视图

基于名字的视图帮助你的代码更具变现力和组织性. 用法很简单:

注册一个基于名字的视图:

View::name('layouts.default', 'layout');

取得一个基于名字的视图:

return View::of('layout');

绑定数据到一个基于名字的视图:

return View::of('layout', array('orders' => $orders));

视图表演者(View Composers)

每次当一个视图被创建时, 它的"composer"事件就会被激活, 你可以监听这一事件并绑定资源和数据到视图之上. 一个常用View Composers的应用场景是博客的侧边栏, 它通常包含一些随机提交的博文. 让你的composer中包含加载侧边栏博文的逻辑代码, 那么现在要做的就是直接引入这个视图就好. 这样你就不必在控制器中通过模型加载这些侧边栏数据了, 因为这些数据通常是与用户的直接请求目的无关的. Composers被定义在application/routes.php文件中, 这是一个例子:

为"home"视图注册一个composer:

View::composer('home', function($view)
{
    $view->nest('footer', 'partials.footer');
});

现在每次"home"视图被创建一个"footer"的视图示例都会通过这个闭包函数传入其中, 它允许你准备任何你想用的视图数据.

为多个视图注册一个composer:

View::composer(array('home', 'profile'), function($view)
{
    //
});

提示: 一个视图可以包含多个composer!

跳转

需要格外注意的是路由和控制器都需要通过'return'关键字显示的返回数据或操作(即必须有响应). 请使用"return Redirect::to()"来代替"Redirect::to()", 这一点是非常重要的, 他区别于其他PHP框架而且你可以很容易不小心忽略了这一做法的重要性.

跳转到另一个URI:

return Redirect::to('user/profile');

标识特定的状态码并跳转:

return Redirect::to('user/profile', 301);

跳转到安全URI(HTTPS):

return Redirect::to_secure('user/profile');

跳转到根目录(首页):

return Redirect::home();

跳回上一个请求:

return Redirect::back();

跳转到一个基于名字的路由:

return Redirect::to_route('profile');

跳转到一个控制器动作:

return Redirect::to_action('home@index');

有时候, 你需要跳转到一个基于名字的路由, 但是同时你还要指定除了URI通配符之外的其他数据, 很容易替换通配符中的数据

带着特定的通配符数据跳转到一个基于名字的路由:

return Redirect::to_route('profile', array($username));

带着特定的通配符数据跳转到一个控制器动作:

return Redirect::to_action('user@profile', array($username));

带一次性数据跳转

当一个用户成功的创建了账户或者登录成功时, 显示一段表示欢迎的状态信息是很正常的. 但是你怎么为下次跳转的请求存储这一信息呢? 用"with()"方法可以解决这一问题:

return Redirect::to('profile')->with('status', 'Welcome Back!');

你可以在视图中通过Session的get方法得到这一信息:

$status = Session::get('status');

更多相关:

下载

发送一个文件下载的响应:

return Response::download('file/path.jpg');

发送一个文件下载的响应并指定下载名称:

return Response::download('file/path.jpg', 'photo.jpg');

错误

如果要产生适当的错误响应, 只需指定你想返回的响应代码. 保存在views/error文件夹下对应的视图文件将会自动的被返回.

生成一个404错误响应:

return Response::error('404');

生成一个500错误响应:

return Response::error('500');