问题描述
我正在尝试使用 Laravel 7 中的中间件来伪造对 3rd 方 API 的 Http 调用。因此,我可以将该中间件分配给将调用该 3rd 方 API 的任何路由。因此,无论何时调用该路由,它都会调用伪造的 API。
这样做的目的是,当我想伪造 API 时,我只需要将中间件分配给路由。当我不想伪造 API 时,我会从路由中删除中间件。
中间件如下所示。
namespace App\Http\Middleware;
class MockApiEndpoints
{
public function handle($request,Closure $next)
{
// mock api/endpoint
$vacancies = $this->vacancyRepository->all();
$url = 'api/endpoint';
$sessionId = Str::uuid()->toString();
$response = [
'result' => 'OK','content' => [
'suggestedVacancies' => array_map(function ($uid) {
return [
'id' => $uid,'relevance' => bcdiv(rand(9,99),100,2)
];
},$vacancies->pluck('uid')->all()),'sessionId' => $sessionId
]
];
$this->mockHttpRequest($url,$response);
return $next($request);
}
protected function mockHttpRequest(string $uri,$response,int $status = 200,array $headers = [])
{
$url = config('api.base_url') . '/' . $uri;
Http::fake([
$url => Http::response($response,$status,$headers)
]);
}
}
即使我将此中间件附加到路由,路由仍会调用原始 API。所以 Htpp::fake
似乎在中间件中不起作用。 Htpp::fake
如果我在控制器中使用它确实有效。
中间件附加到路由如下。 (中间件在 $routeMiddleware
中的 app/Http/Kernal.PHP
数组中正确注册)
namespace App\Providers;
class RouteServiceProvider extends ServiceProvider
{
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware(['MockApiEndpoints'])
->namespace($this->namespace . '\Api')
->group(base_path('routes/api.PHP'));
}
}
我通过一种变通方法完成了我的工作。但我想知道为什么 Http::fake
在中间件中不起作用。提前感谢您的回答。
解决方法
您应该在中间件中返回一个 response(...) 而不是返回 $next($request)。 也许只是转发假电话的回复。
req.isAuthenticated()