路由
之前的笔记章节我们已经使用过很多次路由了,但是我们并没有用到太复杂的特性,这里我们再深入了解一下其它重要的路由配置。
路由配置
Laravel的路由,统一配置在工程根目录的routes文件夹下。
web路由和api路由
Laravel中,路由主要配置在routes/api.php和routes/web.php中。前者使用web中间件组,额外提供会话状态、CSRF保护等功能,基于浏览器的应用应该使用此类路由;后者使用api中间件组,基于客户端程序的应用应该使用此类路由。
我们可以查看一下Kernel.php中的默认内容。
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
何时使用api路由?在基于客户端程序的应用中,比如Android APP,Winform程序、Unity制作的游戏等,这些应用的客户端完全是我们自己来开发,不存在浏览器的Cookie、Session、CSRF等机制,会话状态等诸多功能需要我们手动实现,也就没必要使用web路由的那些中间件了。而只要是基于浏览器的应用(包括前后端分离的应用程序和Electron应用程序),就应该使用web路由。
路由定义
一个路由配置例子如下,访问/地址,由IndexController的index方法处理。
Route::get('/', 'IndexController@index');
除了GET方法,路由支持其它的HTTP方法如下:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
要注意的是,除了GET,其它方法Laravel均默认开启了CSRF保护,无论是后端模板还是Ajax请求,都需要注意这一点。
路由路径参数
路径参数配置例子如下:
Route::get('/users/{id}', 'UserController@show');
路径参数会自动注入控制器方法参数中。
这里要注意,此处路径参数id是一个必选参数,正确的访问地址形如/users/1,而访问形如/users则会报错404。
当然,Laravel也支持可选的路径参数和默认值。例子如下:
Route::get('/users/{id?}', 'UserController@show');
控制器方法也需要指定对应函数参数的默认值:
public function show(Request $request, int $id = 1)
{
...
}
路由组
如果我们有一个模块admin,该模块下所有的路由都是admin/开头的,那么显然我们为每个路由都手动写上一个相同的前缀是不太合理的,不利于统一维护,这时可以用上路由组,例子如下。
Route::prefix('/admin')->group(function () {
Route::get('/', 'UserController@index');
Route::get('/users/{id?}', 'UserController@show');
});