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; });

这个事件会接收需要实例化的类名,然后返回给你一个控制器实例。