介绍
您可能希望使用Controller类来组织此行为,而不是在一个文件中定义所有请求处理逻辑。控制器可以将相关的HTTP请求处理逻辑分组为一个类。控制器存储在目录中。routes/web.php``app/Http/Controllers
基本控制器
这是基本控制器类的示例。所有Lumen控制器都应扩展默认Lumen安装随附的基本控制器类:
<?php
namespace 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控制器。因此,您可以键入提示,以了解控制器在其构造函数中可能需要的任何依赖关系。依赖关系将自动解决并注入到控制器实例中:
<?php
namespace 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
<?php
namespace 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
<?php
namespace 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)
{
//
}
}