请教一个laravel路由跳转的问题

在laravel中,假如我浏览器请求一个路由/a,我想在控制器里将请求隐式转发到路由/b进行处理(不能用redirect跳转方法,不能让浏览器地址发生变化),请问需要怎么做呢

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
Route::get('/t1', function (\Illuminate\Http\Request $request) {
    $q = \Illuminate\Http\Request::create('api/t2', 'GET', []);
    return Route::dispatch($q);
});

Route::get('/t2', function () {
    return 'this is t2';
});
7个月前 评论
清风 (楼主) 7个月前
MArtian (作者) 7个月前
清风 (楼主) 7个月前
讨论数量: 10

:joy: /a对应的action方法里面 代码写成跟b一样不就好了

7个月前 评论
Route::get('/t1', function (\Illuminate\Http\Request $request) {
    $q = \Illuminate\Http\Request::create('api/t2', 'GET', []);
    return Route::dispatch($q);
});

Route::get('/t2', function () {
    return 'this is t2';
});
7个月前 评论
清风 (楼主) 7个月前
MArtian (作者) 7个月前
清风 (楼主) 7个月前

可以使用nginx 处理

server {
    listen 80;
    server_name example.com;

    location /a {
        proxy_pass http://localhost/b;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

另外,为啥不直接将 /b 路由直接指向 /a 的控制器方法处理呢

7个月前 评论
清风 (楼主) 7个月前

例如,创建一个 AliasMiddleware 中间件类:

php artisan make:middleware AliasMiddleware

在生成的中间件类中,可以使用以下代码将路由中的 /a 转换为 /b:

namespace App\Http\Middleware;

use Closure;

class AliasMiddleware
{
    public function handle($request, Closure $next)
    {
        $path = $request->getPathInfo();
        if (strpos($path, '/a') === 0) {
            $request->server->set('REQUEST_URI', str_replace('/a', '/b', $path));
        }
        return $next($request);
    }
}

然后,在中间件注册数组中将 AliasMiddleware 注册为全局中间件或路由中间件:

protected $middleware = [
    // ...
    \App\Http\Middleware\AliasMiddleware::class,
];

protected $routeMiddleware = [
    // ...
    'alias' => \App\Http\Middleware\AliasMiddleware::class,
];

现在,当请求到达中间件时,它将检查请求路径是否以 /a 开头,如果是,则替换成 /b,然后将修改后的请求继续传递给下一个处理程序。

你可以将中间件应用于特定路由或路由组,也可以将其应用于所有路由(作为全局中间件)。

7个月前 评论
清风 (楼主) 7个月前

这个问题,如果用业务来举例子,或许会更合适一些,也更容易获得更合适的方案

7个月前 评论

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