2017-04-24 203 views
6

您好我正在使用Cors中间件似乎工作正常,直到我加了Laravel护照现在有一个问题..它显示错误调用未定义的方法Symfony Component HttpFoundation Response :: header()

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

} 

的问题是,如果条件后..任何帮助将appreaciated感谢

+0

你可以分享你'composer.json'文件,这样我们就可以看到每个librairies的版本? –

+0

请试试这个:'$响应 - >包头中>设置($键,$值)' –

+0

我的印象是,护照办理CORS适合你? – Joe

回答

3

看来,从您的应用程序所得到的HttpFoundation\Response,它不具有header方法。因此,你可以尝试将头设置为HttpFoundation\Responseheaders变量。

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

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

在我Kernel.php

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

超棒的家伙!救过我的命:) – jsd

+1

的照射响应来自Symfony的响应延伸,你可以随时处理响应,就好像它是Symfony的反应,而不是单独处理它们。 –

相关问题