視圖及回應
(Views & Responses)
基本回應
從路由取得字串
Route::get('/', function()
{
return 'Hello World';
});
建立自訂回應
Response
的實例是繼承 Symfony\Component\HttpFoundation\Response
類別,提供各種不同的方法去建立一個 HTTP 的回應。
$response = Response::make($contents, $statusCode);
$response->header('Content-Type', $value);
return $response;
添加 cookies 資料到回應中
$cookie = Cookie::make('name', 'value');
return Response::make($content)->withCookie($cookie);
重導
回傳重新導向到指定連結
return Redirect::to('user/login');
回傳重新導向到指定名稱的路由
return Redirect::route('login');
回傳重新導向到指定名稱的路由,並添加參數資料
return Redirect::route('profile', array(1));
回傳重新導向到指定名稱的路由,並添加有命名的參數資料
return Redirect::route('profile', array('user' => 1));
回傳重新導向到指定控制器的動作中
return Redirect::action('HomeController@index');
回傳重新導向到指定控制器的動作中,並添加參數資料
return Redirect::action('UserController@profile', array(1));
回傳重新導向到指定控制器的動作中,並添加有命名的參數資料
return Redirect::action('UserController@profile', array('user' => 1));
視圖
視圖 (View) 基本上都會包含 HTML ,提供你的網頁程式能夠方便的將控制器 (Controller) 抽離開前端呈現的邏輯之外,視圖的檔案是存放在 app/views
目錄中。
一個簡易的視圖會長成像這樣:
<!-- View stored in app/views/greeting.php -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
這個視圖呈現在瀏覽器會是像這樣:
Route::get('/', function()
{
return View::make('greeting', array('name' => 'Taylor'));
});
傳給 View::make
的第二個參數是一個陣列資料,這些陣列可以在視圖中被存取到:
傳送資料到視圖
$view = View::make('greeting', $data);
$view = View::make('greeting')->with('name', 'Steve');
在上面的例子中,$name
可以在視圖裡被存取到,而資料值會是 Steve
。
你也可以在不同的視圖中共享部分的資訊:
View::share('name', 'Steve');
傳送子視圖到視圖中
有時你可能想要將一個視圖的資料,傳送到另一個視圖中呈現,舉例來說,在將子視圖存放在 app/views/child/view.php
中,我們可以將它傳到另一個視圖中,像這樣:
$view = View::make('greeting')->nest('child', 'child.view');
$view = View::make('greeting')->nest('child', 'child.view', $data);
子視圖可以被呈現在母視圖:
<html>
<body>
<h1>Hello!</h1>
<?php echo $child; ?>
</body>
</html>
視圖Composers
視圖 Composer 是一個回呼 (callback) 或類別的方法,當視圖被建立時會呼叫這個方法,如果你有資料想要每次都綁定到視圖上,視圖 Composer 可以將這些資料整合在相同地方,因此視圖 Composer 會像是"視圖的模型 (view models)"或是"呈現器 (presenters)"。
定義一個視圖 Composer
View::composer('profile', function($view)
{
$view->with('count', User::count());
});
現在每次 profile
視圖被建立時,count
資料將會都被綁訂到此視圖。
你也可以一次就將視圖 Composer 綁訂到多個視圖當中:
View::composer(array('profile','dashboard'), function($view)
{
$view->with('count', User::count());
});
假如你想用類別為基礎的 Composer,透過 IoC容器 的應用可以提供你解決更多這樣的問題,你可以這樣做:
View::composer('profile', 'ProfileComposer');
一個視圖的 Composer 類別應該被定義成像這樣:
class ProfileComposer {
public function compose($view)
{
$view->with('count', User::count());
}
}
請注意到,這裡並沒有任何的規矩去限制 Composer 類別要存在什麼樣的地方,你可以將她存放在任何的地方,只要他們可以使用 composer.json
的檔案做紀錄,去直接自動的載入這個類別:
特殊回應
建立一個 JSON 資料格式的回應
return Response::json(array('name' => 'Steve', 'state' => 'CA'));
建立一個 JSONP 資料格式的回應
return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback'));
建立一個下載檔案的回應
return Response::download($pathToFile);
return Response::download($pathToFile, $name, $headers);