路由

之前的笔记章节我们已经使用过很多次路由了,但是我们并没有用到太复杂的特性,这里我们再深入了解一下其它重要的路由配置。

路由配置

Laravel的路由,统一配置在工程根目录的routes文件夹下。

web路由和api路由

Laravel中,路由主要配置在routes/api.phproutes/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路由。

路由定义

一个路由配置例子如下,访问/地址,由IndexControllerindex方法处理。

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');
});
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。