標籤:http 使用 os 檔案 資料 io
原作者部落格: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 = ‘[email protected]‘;
還可以用類數組的方式操作:
$view[‘name‘] = ‘James‘;$view[‘email‘] = ‘[email protected]‘;
這麼多種的資料繫結方式,總有一款適合你。
給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){ //});