我想在响应 JSON 中添加 API 响应所需的时间。目前正在使用 Lumen 框架开发 API。
如果有人可以指导最好的方法。不确定我是否必须使用框架提供的任何 Hook,或者只是在路由文件中计算它们。以及如何将其推送到所有 API 响应。
PS:仍在学习 Laravel/Lumen 框架。
谢谢, 坦美
请您参考如下方法:
在您的 public/index.php
文件中,添加一个常量:
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| First we need to get an application instance. This creates an instance
| of the application / container and bootstraps the application so it
| is ready to receive HTTP / Console requests from the environment.
|
*/
// To calculate your app execution time
define('LUMEN_START', microtime(true));
$app = require __DIR__.'/../bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
$app->run();
下一步是创建一个中间件并启用它,以便我们可以操纵我们的响应。在 app/Http/Middleware
中创建一个名为 MeasureExecutionTime.php
的中间件。
<?php
namespace App\Http\Middleware;
use Closure;
class MeasureExecutionTime
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle($request, Closure $next)
{
// Get the response
$response = $next($request);
// Calculate execution time
$executionTime = microtime() - LUMEN_START;
// I assume you're using valid json in your responses
// Then I manipulate them below
$content = json_decode($response->getContent(), true) + [
'execution_time' => $executionTime,
];
// Change the content of your response
$response->setContent($content);
// Return the response
return $response;
}
}
要在您的应用程序中启用此中间件,请添加:
$app->middleware([
App\Http\Middleware\MeasureExecutionTime::class
]);
在您的 bootstrap/app.php
文件中。所以它会是这样的:
<?php
require_once __DIR__.'/../vendor/autoload.php';
try {
(new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
// n00p
}
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/
$app = new Laravel\Lumen\Application(
realpath(__DIR__.'/../')
);
// $app->withFacades();
// $app->withEloquent();
/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
/*
|--------------------------------------------------------------------------
| Register Middleware
|--------------------------------------------------------------------------
|
| Next, we will register the middleware with the application. These can
| be global middleware that run before and after each request into a
| route or middleware that'll be assigned to some specific routes.
|
*/
$app->middleware([
App\Http\Middleware\MeasureExecutionTime::class
]);
// $app->middleware([
// App\Http\Middleware\ExampleMiddleware::class
// ]);
// $app->routeMiddleware([
// 'auth' => App\Http\Middleware\Authenticate::class,
// ]);
/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/
// $app->register(App\Providers\AppServiceProvider::class);
// $app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);
/*
|--------------------------------------------------------------------------
| Load The Application Routes
|--------------------------------------------------------------------------
|
| Next we will include the routes file so that they can all be added to
| the application. This will provide all of the URLs the application
| can respond to, as well as the controllers that may handle them.
|
*/
$app->group(['namespace' => 'App\Http\Controllers'], function ($app) {
require __DIR__.'/../app/Http/routes.php';
});
return $app;
Note If there are another middlewares in your application, you may add
MeasureExecutionTime
middleware at theEND
of any other middlewares.
为了进一步研究,我为您提供了文档链接:
- Middleware .
- Responses .
更新
如果您不想将耗时添加到响应正文中,可以将其添加到 header 中:
<?php
namespace App\Http\Middleware;
use Closure;
class MeasureExecutionTime
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('X-Elapsed-Time', microtime(true) - LUMEN_START);
return $response;
}
}