关于Laravel路由问题

1. 运行环境

LNMP

1). 当前使用的 Laravel 版本?

Laravel Framework 8.83.25

2). 当前使用的 php/php-fpm 版本?

PHP 7.4.3

3). 当前系统

CentOS8

4). 业务环境

开发环境

5). 相关软件版本

Nginx

2. 问题描述?

我有两个路由文件,routes/web.php,routes/api.php, 在RouteServiceProvider代码如下:

Route::prefix('api')
    ->namespace($this->namespace)
    ->group(base_path('routes/api.php'));

Route::middleware('web')
    ->namespace($this->namespace)
    ->group(base_path('routes/web.php'));
Route::namespace('Web')->group(function () {
    // 调试
    echo 'Router.web';
    Route::get('/', App\Http\Controller\Web\IndexController::class, 'index');
})
Route::namespace('Api')->prefix('v1')->group(function () {
    // 调试
    echo 'Router.api';
    Route::get('/', App\Http\Controller\Web\IndexController::class, 'index');
})

现在在问题是在每一次请求他都会执行router/api.php 写的 echo ‘Router.api’
按照我的理解,我即然是web过来的,通过名称空间过滤不应该走Api的
在这个试验里,虽然请求最终会落到web.php配的路由里,但是每次请求他要遍历所有的路由文件以及配置项,我想问的是怎么让路由精确的定位某个路由文件上

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

Laravel 的路由在没有生成 cache 的情况下每次都会执行所有路由的逻辑,包括 Group 的 callback。换句话说echo 'Router.api';并不是在路由精准匹配时执行,而是在构建路由表的时候就已经执行了!就是当你使用 php artisan route:cache 后,echo 'Router.api';这部分代码就失效了,最终生成的只是一个路由数组。

1年前 评论
neo88948 (楼主) 1年前
讨论数量: 6
JaguarJack

通过 request 对象里面 path 判断,例如 判断 path 里面有没有 v1 这样的字符。有就加载, 伪代码

if (str_contains(request()->path(), 'v1')) {
    Route::namespace('Api')->prefix('v1')->group(function () {
     // 调试
        echo 'Router.api';
        Route::get('/', App\Http\Controller\Web\IndexController::class, 'index');
    })
}
1年前 评论

RouteServiceProvider 只是路由注册,并不是执行路由,框架会有优先注册路由,当然,你可以再RouteServiceProvider判断,如果是php-fpm,根据响应的注册不同的路由文件,单前提是你里面没有使用到未注册路由相关的

1年前 评论

laravel的生命周期会加载一遍所有再routerprovider里面的路由后再去进行路由匹配,而不是进行路由匹配后再去加载单一路由

1年前 评论

Laravel 的路由在没有生成 cache 的情况下每次都会执行所有路由的逻辑,包括 Group 的 callback。换句话说echo 'Router.api';并不是在路由精准匹配时执行,而是在构建路由表的时候就已经执行了!就是当你使用 php artisan route:cache 后,echo 'Router.api';这部分代码就失效了,最终生成的只是一个路由数组。

1年前 评论
neo88948 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!