首页 > 代码库 > laravel3学习笔记(四)

laravel3学习笔记(四)

原作者博客:ieqi.net

====================================================================================================

视图

Laravel3遵循MVC模式,视图层负责将控制器处理好的数据展示出来,view层相关代码文件保存在application/views目录下,并且以php结尾。

因为PHP本身就可以和HTML混写的特性,一般而言,PHP框架的View层某种程度上也可以作为模板使用。

 

比如我们建立一个文件 application/views/home/index.php :

    Hello World!

这样,我们就可以在处理请求返回时调用view渲染:

// 路由回调方法Route::get(‘/‘, function(){    return View::make(‘home.index‘);});// controller 中的方法public function action_index(){    return View::make(‘home.index‘);});

注意上面make()方法中的参数,使用.作为层级划分,没有php后缀,与views文件夹下的文件对应一目了然。

我们可以通过下述方法,探测view是否存在:

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

有时,我们需要设定特殊的http状态码,或者是http头信息,我们可以这样在返回时处理:

$headers = array(‘foo‘ => ‘bar‘);return Response::make(‘Hello World!‘, 200, $headers);

注意,上述的make方法不是View类中的make,而是Response中的make方法。

返回view并绑定数据:

return Response::view(‘home‘, array(‘foo‘ => ‘bar‘));

返回json格式数据:

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

直接利用orm返回json数据,前提当然是你有使用orm:

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

绑定数据渲染view

Laravel3提供多种方式在渲染View时绑定数据,为开发者提供最大的便利(语法糖猛了一点)。

With绑定

return View::make(‘home‘)->with(‘name‘, ‘James‘);

然后就可以在名为home的view中使用变量$name了,变量值为 ‘James’

with绑定可以链式使用:

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

绑定数组:

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

可以将绑定属性当做view类的属性处理:

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

还可以用类数组的方式操作:

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

这么多种的数据绑定方式,总有一款适合你。

给view命名

给命名view有什么意义呢?和命名路由一样,增加一层命名抽象,我们就可以减少在变更view本身文件名等改动时其他部分的改动成本。

首先注册view的命名,需要写到 routes.php 中:

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

调用时,这样使用;

return View::of(‘layout‘);

绑定数据:

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

当然,也可以使用with绑定数据。

return View::of(‘layout‘)->with(‘name‘, ‘Will‘);

view合成器

一般网页上有很多相对固定的块区,展示相对固定的东西,比如导航栏,比如最新文章之类。如果我们每次渲染view都将这些数据绑定到前端,不仅使得代码臃肿而且不利于维护。

题外话:
这个问题其实可以看做考察一个web框架的标杆,web框架能为我们开发web提供什么样的便利?漂亮的文件组织?orm?MVC?模板系统?这些都很重要,但是说实话现在大多框架这些方面做的都很好,可以说除了结构、编码风格以外没什么差别了。而对块区的处理则最能展现各个框架的特点。在yii中,我们有Widget,在flask中我们有blueprint和content。

在Laravel3中我们可以通过,view合成器来解决这个问题,view合成器需要在routes.php文件中编写;

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

通过上述代码,我们给home这个view嵌入了partials.footer这个子view。

我们还可以一次合成多个view

// 合成器处理home和profile这两个viewView::composer(array(‘home‘, ‘profile‘), function($view){    //});