HTTP 控制器

介绍

除了在单一的 routes.php 文件中定义所有的请求处理逻辑之外,你可能希望使用控制器类来组织此行为。控制器可将相关的 HTTP 请求处理逻辑组成一个类。控制器通常存放在 app/Http/Controllers 此目录中。

基础控制器

这里是一个基础控制器类的例子:

  1. <?php namespace App\Http\Controllers;
  2. use App\User;
  3. use App\Http\Controllers\Controller;
  4. class UserController extends Controller {
  5. /**
  6. * Show the profile for the given user.
  7. *
  8. * @param int $id
  9. * @return Response
  10. */
  11. public function showProfile($id)
  12. {
  13. return view('user.profile', ['user' => User::findOrFail($id)]);
  14. }
  15. }

我们可以通过如下方式引导路由至对应的控制器动作:

  1. $app->get('user/{id}', 'App\Http\Controllers\UserController@showProfile');

Note: 所有的控制器都应该扩展 App\Http\Controllers\Controller 基础控制器类.

控制器和命名空间

和闭包路由一样,你也可以指定控制器路由的名称。

  1. $app->get('foo', ['uses' => 'App\Http\Controllers\FooController@method', 'as' => 'name']);

命名路由可以用以下方法来生成 URL :

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

带参数的命名路由:

  1. $url = route('name', ['id' => 1]);

控制器中间件

中间件 可在控制器路由中指定,例如:

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

你也可以在控制器构造器中指定中间件 :

  1. class UserController extends Controller {
  2. /**
  3. * Instantiate a new UserController instance.
  4. */
  5. public function __construct()
  6. {
  7. $this->middleware('auth');
  8. $this->middleware('log', ['only' => ['fooAction', 'barAction']]);
  9. $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
  10. }
  11. }

依赖注入和控制器

构造器注入

Lumen / Laravel 服务容器 用于解析所有的 Laravel 控制器。因此,你可以在控制器所需要的构造器中,对依赖作任何的类型限制。

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

方法注入

除了建构器注入外,你也可以对控制器方法的依赖作类型限制。例如,让我们对某个方法的 Request 实例作类型限制:

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

如果你的控制器方法预期由路由参数取得输入,只要在其他的依赖之后列出路由参数即可:

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