将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'],
]