将所有的请求处理逻辑都放在单個routes.php
中肯定是不合理的你也许还希望使用控制器类组织管理这些行为。控制器可以将相关的HTTP请求封装到一个类中进行处理通常控制器存放在app/Http/Controllers
目录中。
下面是一个基本控制器类的例子所有的Lumen控制器应该继承自Lumen安装默认的基本控制器:
* 为指定路由通讯协议用户显示详情我们鈳以像这样路由到控制器动作:
现在,如果一个请求匹配指定路由通讯协议的路由URIUserController
的showProfile
方法就会被执行。当然路由参数也会被传递给这個方法。
你应该注意到我们在定义控制器路由的时候没有指定路由通讯协议完整的控制器命名空间我们只需要定义App\Http\Controllers
之后的类名部分。默認情况下bootstrap/app.php
将会在一个路由分组中载入routes.php
文件,该路由分组包含了控制器的根命名空间
2.2 命名控制器路由
和闭包路由一样,可以指定路由通訊协议控制器路由的名字:
一旦你为控制器路由分配了名字那么你就可以使用帮助函数action
很方便的生成URL到action,这里我们也只需要指定路由通訊协议相对 App\Http\Controllers
的命名空间即可:
你还可以使用帮助函数route
来为已命名的控制器路由生成URL:
中间件可以像这样分配给控制器路由:
但是将中间件放在控制器构造函数中更方便,在控制器的构造函数中使用middleware
方法你可以很轻松的分配中间件给该控制器你甚至可以限定该中间件到该控制器类的特定方法:
4、依赖注入&控制器
Lumen使用解析所有的Lumen控制器,因此可以在控制器的构造函数中类型提示任何依赖,这些依赖会被自動解析并注入到控制器实例中:
* 创建新的控制器实例当然你还可以类型提示任何,如果容器可以解析就可以进行类型提示。
除了构造函数注入之外还可以在控制器的动作方法中进行依赖的类型提示,例如我们可以在某个方法中类型提示Illuminate\Http\Request
实例:
如果控制器方法期望输叺路由参数,只需要将路由参数放到其他依赖之后例如,如果你的路由定义如下:
你需要通过定义控制器方法如下所示来类型提示Illuminate\Http\Request
并访問路由参数id: