Laravel 5.6 如何在不改动现有路由的情况下为所有URL添加前缀
无需修改现有路由为所有URL添加前缀(Laravel 5.6)
嘿,这个需求我之前也碰到过——谁想对着一堆路由文件挨个改啊!给你两个不用动现有路由代码的解决方案,完美适配Laravel 5.6:
方法1:通过RouteServiceProvider统一包裹路由(推荐)
这个方法是Laravel官方风格的做法,不用修改任何现有路由文件,只需要在路由服务提供者里统一给所有路由加上前缀。
步骤如下:
- 打开
app/Providers/RouteServiceProvider.php文件 - 找到
mapWebRoutes方法(如果你的项目还有API路由,就一并处理mapApiRoutes) - 在原有的路由注册逻辑外层,加上
->prefix('home')前缀设置
修改前的mapWebRoutes大概是这样:
protected function mapWebRoutes() { Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); }
修改后变成:
protected function mapWebRoutes() { Route::prefix('home') // 新增这一行,添加前缀 ->middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); }
这样一来,routes/web.php里的所有路由都会自动带上home/前缀,比如原来的company路由会变成home/company。而且用route('company')生成URL时,也会自动加上前缀,完全不用改业务代码里的路由调用。
方法2:URL生成宏+请求路径重写(适合特殊场景)
如果不想碰路由服务提供者的注册逻辑,可以用这个“曲线救国”的方法,通过修改URL生成规则和重写请求路径来实现:
第一步:让所有生成的URL自动加前缀
打开app/Providers/AppServiceProvider.php,在boot方法里添加URL生成的宏,自动给非外部URL加上home/前缀:
use Illuminate\Routing\UrlGenerator; public function boot(UrlGenerator $url) { // 重写默认的url生成方法,自动加前缀 $url->macro('url', function ($path = null, $parameters = [], $secure = null) use ($url) { // 跳过外部链接和已经带前缀的路径 if ($path && !starts_with($path, ['http', '/home/'])) { $path = 'home/' . ltrim($path, '/'); } return $url->to($path, $parameters, $secure); }); }
第二步:添加中间件重写请求路径
当用户访问home/company时,我们需要把路径改成company让Laravel匹配到原路由:
- 生成中间件:
php artisan make:middleware AddUrlPrefix - 打开生成的
app/Http/Middleware/AddUrlPrefix.php,修改handle方法:
public function handle($request, Closure $next) { $path = $request->path(); // 如果路径以home/开头,就去掉前缀 if (starts_with($path, 'home/')) { $newPath = substr($path, 5); // 5是"home/"的长度 $request->server->set('REQUEST_URI', '/' . $newPath); } return $next($request); }
- 把这个中间件加到web中间件组里:打开
app/Http/Kernel.php,在$middlewareGroups['web']数组末尾添加:
\App\Http\Middleware\AddUrlPrefix::class,
这样用户访问带前缀的URL时,中间件会把路径转换成原路由的路径,Laravel能正确匹配;同时生成的所有URL都会自动带上home/前缀。
两种方法里,方法1更简洁可靠,是官方推荐的方式,维护成本更低;方法2适合一些不能改动路由注册逻辑的特殊场景。
内容的提问来源于stack exchange,提问作者DZS
相关产品推荐
相关产品推荐

