【问题标题】:Call to undefined method Symfony\Component\HttpFoundation\Response::header()调用未定义的方法 Symfony\Component\HttpFoundation\Response::header()
【发布时间】:2017-09-21 10:41:38
【问题描述】:

嗨,我使用的是 cors 中间件,在我添加 Laravel Passport 之前它似乎工作正常,现在它有问题.. 它显示错误

 Call to undefined method Symfony\Component\HttpFoundation\Response::header() on line number 36 

这是我的中间件:

<?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;
    }

}

问题是在 if 条件之后.. 任何帮助将不胜感激

【问题讨论】:

  • 您能否分享您的composer.json 文件,以便我们查看每个库的版本?
  • 请试试这个:$response-&gt;headers-&gt;set($key, $value)
  • 我的印象是护照会为您处理 CORS?

标签: php laravel laravel-5 laravel-passport


【解决方案1】:

您好,我遇到了同样的问题。这似乎是 Passport 中的一个错误,并且有许多开发人员处于相同的情况。我刚刚找到了这个问题的解决方案。我们得到这个错误的原因是因为我们在middleware 中得到的响应对象通常是Illuminate\Http\Response 类的一个实例,我们可以使用header('Header-Key', 'Header-Value') 方法设置响应头,而 Passport 处理的请求将是一个@ 987654324@ 这就是为什么我们得到错误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;

在我的Kernel.php

protected $middleware = [
    \App\Http\Middleware\Cors::class,
    // ....
];

【讨论】:

  • 太棒了!救了我的命:)
  • Illuminate 响应扩展自 Symfony 响应,因此您可以始终将响应视为 Symfony 响应,而不是单独处理它们。
  • 当在 laravel 中超过 api 油门限制时,429 错误也会返回为 'Symfony\Component\HttpFoundation\Response',这样可以防止这种情况下的错误。谢谢。
  • 令人失望的是,近 5 年后这仍然是一个问题。
【解决方案2】:

似乎从您的应用程序中获得了HttpFoundation\Response,它没有header 方法。因此,您可以尝试将标头设置为HttpFoundation\Responseheaders 变量。

foreach ($headers as $key => $value)
    $response->headers->set($key, $value);
return $response;

【讨论】:

    【解决方案3】:

    我这样做的时候遇到了这个问题

    return Response::stream($callback, 200, $headers);
    

    我通过简单地在 Response 之前加上斜杠 (\) 来解决它,如下所示:

    return \Response::stream($callback, 200, $headers);
    

    试试这个解决方案:谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2017-06-06
      • 1970-01-01
      相关资源
      最近更新 更多