调用未定义的方法Symfony\Component\HttpFoundation\Response :: header()

Sye*_*zmi 8 php cors laravel laravel-passport laravel-5.4

嗨,我正在使用一个cors中间件似乎工作正常,直到我添加Laravel Passport现在有一个问题..它显示错误

 Call to undefined method Symfony\Component\HttpFoundation\Response::header() on line number 36 
Run Code Online (Sandbox Code Playgroud)

这是我的中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Response;

class Cors
{

    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

// ALLOW OPTIONS METHOD
        $headers = [
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Headers' => "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers"
        ];


        if ($request->getMethod() == "OPTIONS") {
// The client-side application can set only headers allowed in Access-Control-Allow-Headers
            return Response::make('OK', 200, $headers);
        }

        $response = $next($request);
        foreach ($headers as $key => $value)
            $response->header($key, $value);
        return $response;
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是在if条件之后..任何帮助都将得到应用谢谢

Pak*_*kit 20

嗨,我遇到了同样的问题.看起来这是Passport中的错误,并且有许多开发人员处于相同的情况.我刚刚找到了解决这个问题的方法.我们得到这个错误的原因是因为我们进入的Response对象middleware通常是一个Illuminate\Http\Response类的实例,我们可以使用该方法设置Response头,header('Header-Key', 'Header-Value')而Passport处理的Request将是一个实例,Symfony\Component\HttpFoundation\Response这就是我们得到错误的原因Call to undefined method Symfony\Component\HttpFoundation\Response::header()

下面是我用来解决这个错误的代码,现在一切正常.我希望它可以帮助其他开发人员了解如何修复它然后适应他们的代码.

$response = $next($request);
$IlluminateResponse = 'Illuminate\Http\Response';
$SymfonyResopnse = 'Symfony\Component\HttpFoundation\Response';
$headers = [
    'Access-Control-Allow-Origin' => '*',
    'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, PATCH, DELETE',
    'Access-Control-Allow-Headers' => 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers',
];

if($response instanceof $IlluminateResponse) {
    foreach ($headers as $key => $value) {
        $response->header($key, $value);
    }
    return $response;
}

if($response instanceof $SymfonyResopnse) {
    foreach ($headers as $key => $value) {
        $response->headers->set($key, $value);
    }
    return $response;
}

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

在我的 Kernel.php

protected $middleware = [
    \App\Http\Middleware\Cors::class,
    // ....
];
Run Code Online (Sandbox Code Playgroud)

  • Illuminate响应扩展了Symfony响应,因此您可以始终将响应视为Symfony响应,而不是单独处理它们. (3认同)
  • 了不起的家伙!救了我的命 :) (2认同)

Pan*_*ami 7

似乎从你的应用程序中你得到的HttpFoundation\Response,没有header方法.因此,您可以尝试将标头设置为headers变量HttpFoundation\Response.

foreach ($headers as $key => $value)
    $response->headers->set($key, $value);
return $response;
Run Code Online (Sandbox Code Playgroud)