如何使用中间件向响应添加标头?

Mar*_*lln 12 laravel laravel-5

我无法弄清楚如何将标头添加到中间件的响应中.我已经使用了两者->header(...),->headers->set(...)但两者都给出了错误.你是怎么做到的?

首先我尝试了

public function handle($request, Closure $next) {
    $response = $next($request);

    $response->headers->set('refresh', '5;url=' . route('foo'));

    return $response;
}
Run Code Online (Sandbox Code Playgroud)

这与in相同Illuminate\Http\Middleware\FrameGuard.php,但是给出了

在非对象上调用成员函数set()

我试过第二次

public function handle($request, Closure $next) {
    $response = $next($request);

    $response->header('refresh', '5;url=' . route('foo'));

    return $response;
}
Run Code Online (Sandbox Code Playgroud)

但这给了

方法[header]在视图中不存在.

那么如何从中间件添加标头?

Mar*_*lln 8

我通过使用response帮助器解决了这个问题.

use Illuminate\Http\RedirectResponse;

$response = $next($request);
$response = $response instanceof RedirectResponse ? $response : response($response);

return $response->header('refresh', '5;url=' . route('foo'));
Run Code Online (Sandbox Code Playgroud)

所有我的其他中间件似乎都运行正常,所以我猜它没关系.

  • 您可能最好检查:`instanceof Symfony\Component\HttpFoundation\Response`,这样您就可以获得各种响应. (5认同)

Waq*_*ary 6

这是在Laravel 5.0中测试的解决方案,用于将标头附加到路由

创建一个中间件文件 app/Http/Middleware/API.php

<?php namespace App\Http\Middleware;
use Closure;
class API {

    public function handle($request, Closure $next)
    {

            $response = $next($request);
            $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Content-Range, Content-Disposition, Content-Description, X-Auth-Token');
            $response->header('Access-Control-Allow-Origin', '*');
            //add more headers here
            return $response;
        }
}
Run Code Online (Sandbox Code Playgroud)

通过添加这些行将中间件添加到内核文件中 /app/Http/Kernel.php

protected $middleware = [
    //... some middleware here already 
    '\App\Http\Middleware\API',// <<< add this line if you wish to apply globally
];
protected $routeMiddleware = [
    //... some routeMiddleware here already 
    'api' => '\App\Http\Middleware\API', // <<< add this line if you wish to apply to your application only
];
Run Code Online (Sandbox Code Playgroud)

在路线文件中对您的路线进行分组 /app/Http/routes.php

Route::group(['middleware' => 'api'], function () {
    Route::get('api', 'ApiController@index');
    //other routes 
});
Run Code Online (Sandbox Code Playgroud)