# HTTP 控制器
- [简介](#introduction)
- [基础控制器](#basic-controllers)
- [控制器中间件](#controller-middleware)
- [依赖注入 & 控制器](#dependency-injection-and-controllers)
## 简介
为了替代把所有的请求处理逻辑都定义在 `routes.php` 路由文件中,你或许想要使用控制来组织这些行为。控制器可以把相关的请求处理逻辑整合为一个控制器类。控制器类文件被存储在 `app/Http/Controllers` 目录下。
## 基础控制器
这里有一个基础控制器的示例。所有 Lumen 的控制器都应该继承 Lumen 安装时内置的默认的控制器基类:
get('user/{id}', 'UserController@show');
现在,当请求匹配到这个特定的 URI 时, `UserController` 类中的 `show` 方法就会执行。当然,路由的参数也同样传递给了这个方法。
#### 控制器和命名空间
有一点非常重要,那就是我们要注意在定义控制器路由时,不需要指定完整的控制器命名空间。我们只需定义" 根 ".命名空间 `App\Http\Controllers` 之后的类名部分。默认情况下, `bootstrap/app.php` 文件在加载 `routes.php` 时已经把所有路由规则都配置了根控制器命名空间。
如果你选择在 `App\Http\Controllers` 目录内层使用 PHP 命名空间嵌套或组织控制器,只要使用相对于 `App\Http\Controllers` 根命名空间的特定类名称即可。因此,如果你的控制器类全名是 `App\Http\Controllers\Photos\AdminController`,那么你应该注册一个路由,如下所示:
$router->get('foo', 'Photos\AdminController@method');
#### 命名控制器路由
像闭包路由那样,你可以给控制器路由指定一个名称:
$router->get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
你也可以使用 `route` 辅助函数,来生成指向控制器路由的 URL:
$url = route('name');
## 控制器中间件
[中间件](/docs/{{version}}/middleware) 可通过如下方式分配到路由中:
$router->get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
然而,更方便的方式是在控制器的构造方法里面使用 `middleware` 方法指定中间件。你甚至可以限制中间件只应用于该控制器类的某些方法:
class UserController extends Controller
{
/**
* 实例化一个新的 UserController 实例.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => [
'fooAction',
'barAction',
]]);
$this->middleware('subscribed', ['except' => [
'fooAction',
'barAction',
]]);
}
}
## 依赖注入与控制器
#### 构造器注入
Lumen 使用「 [服务容器](/docs/{{version}}/container) 」来解析所有的控制器的依赖注入。因此,你可以在控制器的构造函数中使用类型提示需要的任何依赖。这些依赖将会自动的解析并注入到控制器实例中:
users = $users;
}
}
#### 方法注入
除了构造器注入以外,你也可以在你的控制器方法中使用类型提示依赖项。例如,在某个方法中添加 `Illuminate\Http\Request` 实例的类型提示:
input('name');
//
}
}
如果你想在控制器里获取路由参数,只需要在路由之后列出参数即可。例如,你的路由这样来定义:
$router->put('user/{id}', 'UserController@update');
你可以像下面的例子一样定义你的控制器,用类型提示注入 `Illuminate\Http\Request` 类和你的路由参数 `id` :