基礎
控制器是負責處理用戶輸入和管理模塊、庫與視圖之間交互的類。通常情況下,控制器會向模塊請求數據,然後把數據傳遞給視圖,最後返回給用戶。
在程序開發中控制器通常被用來實現應用邏輯。Laravel框架還允許開發者在路由中聲明應用邏輯,這部分會在路由文檔中詳細說明。但是我們鼓勵新手仍然從控制器開始。在處理應用邏輯方面,控制器和路由沒有什麼不同。
控制器類都應該存放在application/controllers目錄中,並且都繼承於Base_Controller類。Laravel框架默認自帶了一個Home_Controller類。
創建一個簡單的控制器:
class Admin_Controller extends Base_Controller {
public function action_index() {
//
}
}
Actions是允許被訪問的控制器方法,它們都應該以"action_"爲前綴,除此以外的其他方法都是禁止訪問的。
Note: Base_Controller類繼承於Laravel框架的Controller類。
控制器路由
需要我們注意到是,在Laragel框架中所有的路由(包括控制器路由)都必須明確定義。
這意味着沒有在路由中註冊的控制器方法都是不可見的。使用控制器路由註冊之後,控制器方法會自動接受訪問。控制器路由的註冊信息通常定義在application/routes.php文件中。
訪問the routing page獲取更多關於控制器路由的信息。.
插件控制器
插件包是Laravel框架的模塊化管理系統。插件包可以非常容易的配置應用的處理請求。這部分我們將在[插件包]文檔中作進一步瞭解。
創建插件包控制器的方法和創建應用控制器一樣,只需要在控制器名前加上插件包名作爲前綴。比如你的插件包名字叫"admin",那麼插件包控制器可以這樣寫:
創建插件控制器:
class Admin_Home_Controller extends Base_Controller {
public function action_index() {
return "Hello Admin!";
}
}
但是我們怎麼用路由來註冊插件控制器呢?其實也非常簡單:
在路由中註冊插件控制器:
Route::controller('admin::home');
現在我們就可以在瀏覽器中訪問"admin"插件包的home控制器了。
Note: 在Laravel框架中,我們使用雙冒號來表示插件包,插件包更多信息可以閱讀插件包文檔。
行動過濾器
行動過濾器可以運行在控制方法之前,也可以在控制器方法之後.在Laravel框架中你不僅可以爲控制器分配過濾器,同時還可以決定何種HTTP請求會觸發過濾器。
你可以在控制器構造器中爲控制器分配前置或者後置過濾器。
給所有請求附加過濾器:
$this->filter('before', 'auth');
在這個例子中,'auth'過濾器會運行在所有控制器方法之前。我們可以在application/routes.php文件中找到'auth'過濾器。它是用來驗證用戶是否登錄,如果沒有就會重定向到'login'。
給少數控制器附加過濾器:
$this->filter('before', 'auth')->only(array('index', 'list'));
在這個例子中auth過濾器會在action_index()和action_list()方法前運行,用戶必須登錄才能訪問這些頁面。但是該控制器中的其他方法不會觸發身份驗證。
給多數控制器附加過濾器:
$this->filter('before', 'auth')->except(array('add', 'posts'));
在前一個例子當中,過濾器只會運行在指定的控制器方法之前。而在這個例子中,我們聲明的是不需要過濾的控制器方法。
爲POST請求附加過濾器:
$this->filter('before', 'csrf')->on('post');
在這個例子中我給POST請求附加了一個csrf過濾器。'csrf'過濾器主要是用來過濾來自其他系統的posts(比如傳說中的spam機器人)。Larvel框架自帶了這個過濾器,你可以在application/routes.php文件中找到它。
進階閱讀:
- 路由過濾器
嵌套控制器
控制器可以存放在application/controllers目錄的任意層次的子目錄中。
創建一個控制器controllers/admin/panel.php,代碼如下:
class Admin_Panel_Controller extends Base_Controller {
public function action_index() {
//
}
}
在路由中用'.'號來註冊嵌套控制器:
Route::controller('admin.panel');
Note: 當使用嵌套控制器的時候,控制器的註冊順序總是按目錄的層次從深到淺。
訪問控制器的'index'方法:
http://localhost/admin/panel控制器佈局
控制器佈局的完整文檔請閱讀模板文檔.
REST風格控制器
除了使用"action_"前綴之外,我們還可以使用HTTP請求類型來作爲控制器方法的前綴。
爲控制添加REST風格屬性:
class Home_Controller extends Base_Controller {
public $restful = true;
}
建立REST風格的控制器方法:
class Home_Controller extends Base_Controller {
public $restful = true;
public function get_index() {
}
public function post_index(){
}
}
在我們建立CRUD方法的時候這種風格非常的友好。
依賴注入
如果你正在編寫可測試的代碼,你可能會想在你的控制器構造使用依賴注入。這非常簡單,只需要在IoC容器中註冊你的控制器即可。在註冊控制器時,需要使用controller前綴,因此在application/start.php文件中,我們可以像下面這樣註冊控制器:
IoC::register('controller: user', function() {
return new User_Controller;
});
當控制器接收請求時,Laravel框架會自動檢測控制器在容器中是否註冊,如果已註冊,那麼將會生成一個控制器實例。
Note: 在使用控制器的依賴注入前,你應該閱讀IoC容器文檔。
控制器工廠
如果你想更好的控制控制器實例,那麼你就需要是使用Laravel提供的控制器工廠。
爲控制器實例註冊一個事件:
Event::listen(Controller::factory, function($controller) {
return new $controller;
});
這個事件會接收需要實例化的類名,然後返回給你一個控制器實例。