當 Route 收到某個網址時,它會找到對應的 Controller,把任務交給它去處理。Controller 可以決定要取得什麼資料,並回傳什麼 View。
首先,在 app/controllers 目錄下新增一個 HomeController.php。在這個目錄下會有一個 Controller 的基礎類別 BaseController.php ,我們建立的 HomeController.php 必須繼承這個類別,程式碼如下:
<?php
class HomeController extends BaseController {
public function index()
{
return View::make('home')
->with('title', '首頁')
->with('hello', '大家好~~');
}
}
在這個類別中,我們建立了一個 index() 方法,並把原本在 route 中的內容移動到這裡。現在由 HomeController 來回傳 view。
Route::get('/', 'HomeController@index');
原本的 route 變成只有一行了,非常簡潔。第二個參數從原本的匿名函式換成 Controller 的名稱 @ 方法名稱。
現在的整個流程是:
Route -> Controller -> View
這只是 Controller 的基本功能,較複雜功能後面再說明。現在重新整理網頁,會看到一樣的內容,但是現在的運作流程已經改變了。
Laravel 有用到 rewrite_module,所以網址不會出現 index.php 這種帶副檔名的結尾。當在網址中帶參數時,原本的
http://www.aaa.com.tw/post.php?id=1234
這種格式,會被轉換成
http://www.aaa.com.tw/post/1234
既簡短又好看。在 Route 中就可以這樣設定。
例如,我們會以 id 去查詢資料庫中的資料然後顯示。因為我們還沒有說明資料庫的部份,所以這裡的介紹會以假資料來代替。
Route::get('post/{id}', 'HomeController@show');
'post/{id}' 中的 post 是網址的一部份,後面的 {id} 表示為參數。動作的部份指定為新的方法 @show。
public function show($id)
{
return View::make('home')
->with('title', '首頁')
->with('hello', '大家好~~'.$id);
}
因為 show() 方法要處理的 URI 有輸入參數,所以必須加入參數名稱 $id。這裡我們簡單的把它串接在 hello 字串後面。
現在在網址中輸入
http://localhost:8000/post/123
就會顯示
大家好~~123
記得最後面不能有斜線。後面接的 123 就是變數 $id 的值,輸入任何值,controller 就會收到這個值,在實際案例中,這時候就可以去資料庫中查詢資料,最後在附加在 View 中回傳。