Laravel学习之控制器

这篇文件记录了学习Laravel控制器的相关知识。

将所有的请求处理逻辑作为闭包定义在路由文件中是很不合理的,相反,应该使用控制器类来组织。控制器类可以将相关的请求处理逻辑放在单一类中。控制器存放在app/Http/Controller目录下。

基本的控制器

定义一个控制器,继承自Laravel包含的基控制器,该基类提供了一些便利方法,例如middleware方法,用来将中间件放在控制器动作上。

1
2
3
4
5
6
7
8
namespace App\Http\Controllers;
class UserController extends Controller {
public function show($age) {
return view('user.profile',['username' => 'Weichuang','age' => $age]);
}
}

定义一个路由来调用这个控制器动作:

1
2
Route::get('user/{age}','UserController@show');

当请求匹配该路由URI时,UserController类的show方法就会被执行,路由参数也会被传递给该方法。

注意:在定义控制器路由时,不必写出完整的控制器命名空间。因为RouteService是在路由组中加载文件,已经包含了命名空间,因此只需声明命名空间App\Http\Controllers后面的部分。

如果定义只处理单个动作的控制器,可以在控制器中放__invoke方法。

1
2
3
4
5
6
7
8
9
class ShowProfile extends Controller
{
public function __invoke($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}

为单个动作控制器注册路由时,不必声明方法。

1
2
Route::get('user/{id}', 'ShowProfile');

控制器中间件

中间件可以分配给路由文件中的控制器路由:

1
2
Route::get('profile', 'UserController@show')->middleware('auth');

或者,在控制器的构造函数中声明中间件。在控制器的构造函数中,使用middleware方法可以将中间件分配给控制器的动作。甚至可以将中间件限制到控制器的特定方法上。

1
2
3
4
5
6
7
8
9
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}

控制器也允许你使用闭包来注册中间件。

1
2
3
4
5
6
$this->middleware(function ($request, $next) {
// ...
return $next($request);
});

资源控制器