Я пытаюсь использовать промежуточное программное обеспечение в Laravel 7 для подделки вызовов Http к стороннему API. Таким образом, я могу назначить это промежуточное ПО любому маршруту, который будет выполнять вызовы этого стороннего 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
не работает в промежуточном программном обеспечении. Спасибо за ваши ответы заранее.