首页 > 代码库 > 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){ //});