将header附加到所有response()->json()->send()laravel;
Attach header to all response()->json()->send() laravel;
出于某些原因,我使用以下代码从我的 helper/library 发送 JSON 响应而不是控制器:
response()->json(
[
"status" => false,
"message" => "This product is out of stock",
],
200
)->send();
exit;
我的问题是没有中间件 header 如果该响应已发送。如何将 header 附加到所有 response()->json()->send();exit;
函数?
下面是我对默认控制器的回复 header:
上面的响应包含来自所有中间件的所有 header,下面是我的 header 来自 response()->json()->send();exit;
的响应:
上面没有显示来自中间件的 headers。
我知道我可以通过添加 ->header('X-Header-One', 'Header Value')
手动发送 header,如下面的代码:
response()->json(
[
'status' => false,
'message' => 'This voucher is not for selected products',
]
)->header('X-Header-One', 'Header Value')->send();
exit;
但是我已经有这么多回复了,我不想尝试 WETing 我的代码。
在你的Controller.php
添加一个函数并随意调用它
EG
public function MyCustomResponse()
{
...
}
然后让它接受你想要的参数,在你的情况下它是一个数组和一个 int,(数据和状态)
public function MyCustomResponse(array $data, int $status)
{
...
}
然后处理里面的逻辑
public function MyCustomResponse(array $data, int $status)
{
response()->json($data, $status)->header('X-Header-One', 'Header Value')->send();
}
现在,当您想要使用它时,请确保您在放置此代码的位置扩展控制器,然后执行
return $this->myCustomResponse($data, 200);
根据您的需要,更好的选择是使用中间件
public function handle($request, Closure $next)
{
$request->headers->set( ... );
return $next($request);
}
并应用到你的路线
创建一个中间件SetHeader.php
然后
<?php
namespace App\Http\Middleware;
use Closure;
class setHeader
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->headers->set('X-Header-One', 'Header Value');
return $next($request);
}
}
喜欢你可以添加尽可能headers并应用到你想发送的那些路由
经过一些挖掘,您还可以创建一个响应宏
https://laravel.com/docs/8.x/responses#response-macros
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Register the application's response macros.
*
* @return void
*/
public function boot()
{
Response::macro('custom', function ($value) {
return Response::json($value)->headers();
});
}
}
然后在你的代码中,使用
return response()->custom($data);
好吧,这个问题的答案已经给出了,但是我建议使用中间件概念的强大功能。中间件不仅适用于请求,还适用于响应。
通过使用响应宏,我们必须更改引用以使用自定义函数而不是 json。
这是中间件代码。
SetResponseHeaders.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class SetResponseHeaders
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$response = $next($request);
$response->header('X-Header-One', 'XValue');
return $response;
}
}
别忘了注册中间件。
Http/Kernel.php
protected $middleware = [
// other middlewares
\App\Http\Middleware\SetResponseHeaders::class,
]
特别说明:- 如果您使用 CORS 概念,那么您在配置文件夹下有 cors.php 文件。就我而言,我使用的是 fruitcake/laravel-cors
包。所以你必须公开 header 否则你将得不到价值。
cors.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Cross-Origin Resource Sharing (CORS) Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your settings for cross-origin resource sharing
| or "CORS". This determines what cross-origin operations may execute
| in web browsers. You are free to adjust these settings as needed.
|
| To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
*/
// other config
'exposed_headers' => ['X-Header-One'],
]
出于某些原因,我使用以下代码从我的 helper/library 发送 JSON 响应而不是控制器:
response()->json(
[
"status" => false,
"message" => "This product is out of stock",
],
200
)->send();
exit;
我的问题是没有中间件 header 如果该响应已发送。如何将 header 附加到所有 response()->json()->send();exit;
函数?
下面是我对默认控制器的回复 header:
上面的响应包含来自所有中间件的所有 header,下面是我的 header 来自 response()->json()->send();exit;
的响应:
上面没有显示来自中间件的 headers。
我知道我可以通过添加 ->header('X-Header-One', 'Header Value')
手动发送 header,如下面的代码:
response()->json(
[
'status' => false,
'message' => 'This voucher is not for selected products',
]
)->header('X-Header-One', 'Header Value')->send();
exit;
但是我已经有这么多回复了,我不想尝试 WETing 我的代码。
在你的Controller.php
添加一个函数并随意调用它
EG
public function MyCustomResponse()
{
...
}
然后让它接受你想要的参数,在你的情况下它是一个数组和一个 int,(数据和状态)
public function MyCustomResponse(array $data, int $status)
{
...
}
然后处理里面的逻辑
public function MyCustomResponse(array $data, int $status)
{
response()->json($data, $status)->header('X-Header-One', 'Header Value')->send();
}
现在,当您想要使用它时,请确保您在放置此代码的位置扩展控制器,然后执行
return $this->myCustomResponse($data, 200);
根据您的需要,更好的选择是使用中间件
public function handle($request, Closure $next)
{
$request->headers->set( ... );
return $next($request);
}
并应用到你的路线
创建一个中间件SetHeader.php
然后
<?php
namespace App\Http\Middleware;
use Closure;
class setHeader
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->headers->set('X-Header-One', 'Header Value');
return $next($request);
}
}
喜欢你可以添加尽可能headers并应用到你想发送的那些路由
经过一些挖掘,您还可以创建一个响应宏
https://laravel.com/docs/8.x/responses#response-macros
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Register the application's response macros.
*
* @return void
*/
public function boot()
{
Response::macro('custom', function ($value) {
return Response::json($value)->headers();
});
}
}
然后在你的代码中,使用
return response()->custom($data);
好吧,这个问题的答案已经给出了,但是我建议使用中间件概念的强大功能。中间件不仅适用于请求,还适用于响应。
通过使用响应宏,我们必须更改引用以使用自定义函数而不是 json。
这是中间件代码。
SetResponseHeaders.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class SetResponseHeaders
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$response = $next($request);
$response->header('X-Header-One', 'XValue');
return $response;
}
}
别忘了注册中间件。
Http/Kernel.php
protected $middleware = [
// other middlewares
\App\Http\Middleware\SetResponseHeaders::class,
]
特别说明:- 如果您使用 CORS 概念,那么您在配置文件夹下有 cors.php 文件。就我而言,我使用的是 fruitcake/laravel-cors
包。所以你必须公开 header 否则你将得不到价值。
cors.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Cross-Origin Resource Sharing (CORS) Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your settings for cross-origin resource sharing
| or "CORS". This determines what cross-origin operations may execute
| in web browsers. You are free to adjust these settings as needed.
|
| To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
*/
// other config
'exposed_headers' => ['X-Header-One'],
]