介绍

您可能希望使用Controller类来组织此行为,而不是在一个文件中定义所有请求处理逻辑。控制器可以将相关的HTTP请求处理逻辑分组为一个类。控制器存储在目录中。routes/web.php``app/Http/Controllers

基本控制器

这是基本控制器类的示例。所有Lumen控制器都应扩展默认Lumen安装随附的基本控制器类:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\User;
  4. class UserController extends Controller
  5. {
  6. /**
  7. * Retrieve the user for the given ID.
  8. *
  9. * @param int $id
  10. * @return Response
  11. */
  12. public function show($id)
  13. {
  14. return User::findOrFail($id);
  15. }
  16. }

我们可以像这样路由到控制器动作:

  1. $router->get('user/{id}', 'UserController@show');

现在,当请求与指定的路由URI匹配时,将执行该类show上的方法UserController。当然,路线参数也将传递给该方法。

控制器和命名空间

重要的是要注意,在定义控制器路由时,我们不需要指定完整的控制器名称空间。我们仅定义了类名称中位于名称空间“ root” 之后的部分。默认情况下,文件将在包含根控制器名称空间的路由组中加载文件。App\Http\Controllers``bootstrap/app.php``routes.php
如果您选择使用更深入目录的PHP名称空间来嵌套或组织控制器,则只需使用相对于根名称空间的特定类名即可。因此,如果您的完整控制器类为,则可以这样注册一条路由:App\Http\Controllers``App\Http\Controllers``App\Http\Controllers\Photos\AdminController

  1. $router->get('foo', 'Photos\AdminController@method');

命名控制器路由

与关闭路由类似,您可以在控制器路由上指定名称:

  1. $router->get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

您也可以使用route帮助程序生成指向命名控制器路由的URL:

  1. $url = route('name');

控制器中间件

可以将中间件分配给控制器的路由,如下所示:

  1. $router->get('profile', [
  2. 'middleware' => 'auth',
  3. 'uses' => 'UserController@showProfile'
  4. ]);

但是,在控制器的构造函数中指定中间件更为方便。使用middleware控制器构造函数中的方法,您可以轻松地将中间件分配给控制器。您甚至可以将中间件限制为仅控制器类上的某些方法:

  1. class UserController extends Controller
  2. {
  3. /**
  4. * Instantiate a new UserController instance.
  5. *
  6. * @return void
  7. */
  8. public function __construct()
  9. {
  10. $this->middleware('auth');
  11. $this->middleware('log', ['only' => [
  12. 'fooAction',
  13. 'barAction',
  14. ]]);
  15. $this->middleware('subscribed', ['except' => [
  16. 'fooAction',
  17. 'barAction',
  18. ]]);
  19. }
  20. }

依赖注入和控制器

构造函数注入

Lumen服务容器用于解析所有Lumen控制器。因此,您可以键入提示,以了解控制器在其构造函数中可能需要的任何依赖关系。依赖关系将自动解决并注入到控制器实例中:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Repositories\UserRepository;
  4. class UserController extends Controller
  5. {
  6. /**
  7. * The user repository instance.
  8. */
  9. protected $users;
  10. /**
  11. * Create a new controller instance.
  12. *
  13. * @param UserRepository $users
  14. * @return void
  15. */
  16. public function __construct(UserRepository $users)
  17. {
  18. $this->users = $users;
  19. }
  20. }

方法注入

除了构造函数注入外,您还可以在控制器的操作方法上键入提示依赖项。例如,让我们在其中一种方法上键入实例的提示:Illuminate\Http\Request

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class UserController extends Controller
  5. {
  6. /**
  7. * Store a new user.
  8. *
  9. * @param Request $request
  10. * @return Response
  11. */
  12. public function store(Request $request)
  13. {
  14. $name = $request->input('name');
  15. //
  16. }
  17. }

如果您的控制器方法也希望从route参数输入,只需在其他依赖项之后列出您的route参数即可。例如,如果您的路线是这样定义的:

  1. $router->put('user/{id}', 'UserController@update');

您仍然可以通过如下所示定义控制器方法来键入提示并访问route参数:Illuminate\Http\Request``id

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class UserController extends Controller
  5. {
  6. /**
  7. * Update the specified user.
  8. *
  9. * @param Request $request
  10. * @param string $id
  11. * @return Response
  12. */
  13. public function update(Request $request, $id)
  14. {
  15. //
  16. }
  17. }