介绍
您可能希望使用Controller类来组织此行为,而不是在一个文件中定义所有请求处理逻辑。控制器可以将相关的HTTP请求处理逻辑分组为一个类。控制器存储在目录中。routes/web.php``app/Http/Controllers
基本控制器
这是基本控制器类的示例。所有Lumen控制器都应扩展默认Lumen安装随附的基本控制器类:
<?phpnamespace App\Http\Controllers;use App\User;class UserController extends Controller{/*** Retrieve the user for the given ID.** @param int $id* @return Response*/public function show($id){return User::findOrFail($id);}}
我们可以像这样路由到控制器动作:
$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
$router->get('foo', 'Photos\AdminController@method');
命名控制器路由
与关闭路由类似,您可以在控制器路由上指定名称:
$router->get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
您也可以使用route帮助程序生成指向命名控制器路由的URL:
$url = route('name');
控制器中间件
可以将中间件分配给控制器的路由,如下所示:
$router->get('profile', ['middleware' => 'auth','uses' => 'UserController@showProfile']);
但是,在控制器的构造函数中指定中间件更为方便。使用middleware控制器构造函数中的方法,您可以轻松地将中间件分配给控制器。您甚至可以将中间件限制为仅控制器类上的某些方法:
class UserController extends Controller{/*** Instantiate a new UserController instance.** @return void*/public function __construct(){$this->middleware('auth');$this->middleware('log', ['only' => ['fooAction','barAction',]]);$this->middleware('subscribed', ['except' => ['fooAction','barAction',]]);}}
依赖注入和控制器
构造函数注入
Lumen服务容器用于解析所有Lumen控制器。因此,您可以键入提示,以了解控制器在其构造函数中可能需要的任何依赖关系。依赖关系将自动解决并注入到控制器实例中:
<?phpnamespace App\Http\Controllers;use App\Repositories\UserRepository;class UserController extends Controller{/*** The user repository instance.*/protected $users;/*** Create a new controller instance.** @param UserRepository $users* @return void*/public function __construct(UserRepository $users){$this->users = $users;}}
方法注入
除了构造函数注入外,您还可以在控制器的操作方法上键入提示依赖项。例如,让我们在其中一种方法上键入实例的提示:Illuminate\Http\Request
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller{/*** Store a new user.** @param Request $request* @return Response*/public function store(Request $request){$name = $request->input('name');//}}
如果您的控制器方法也希望从route参数输入,只需在其他依赖项之后列出您的route参数即可。例如,如果您的路线是这样定义的:
$router->put('user/{id}', 'UserController@update');
您仍然可以通过如下所示定义控制器方法来键入提示并访问route参数:Illuminate\Http\Request``id
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller{/*** Update the specified user.** @param Request $request* @param string $id* @return Response*/public function update(Request $request, $id){//}}
