Laravel開發教程之-控制器

基礎

控制器是負責處理用戶輸入和管理模塊、庫與視圖之間交互的類。通常情況下,控制器會向模塊請求數據,然後把數據傳遞給視圖,最後返回給用戶。

在程序開發中控制器通常被用來實現應用邏輯。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; 
});


這個事件會接收需要實例化的類名,然後返回給你一個控制器實例。


發佈了41 篇原創文章 · 獲贊 11 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章