2017-04-24 1 views
6

Hallo ich war mit einer Cors Middleware, die gut zu funktionieren scheint, bis ich Laravel Passport jetzt gibt es ein Problem damit .. Es zeigt den FehlerAufruf zu undefinierter Methode Symfony Component HttpFoundation Response :: header()

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

Dies ist meine Middleware:

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

} 

die Frage nach dem, wenn die Bedingung ist .. Jede Hilfe wird dank

+0

Können Sie Ihre 'composer.json' Datei teilen, damit wir die Versionen jeder librairies sehen kann? –

+0

Bitte versuchen Sie dies: '$ response-> headers-> set ($ Schlüssel, $ Wert)' –

+0

Ich hatte den Eindruck, dass Pass CORS für Sie behandelt? – Joe

Antwort

3

appreaciated werden Es scheint, dass Sie aus Ihrer Anwendung bekommen die HttpFoundation\Response, die nicht die header Methode hat. Stattdessen können Sie versuchen, den Header auf die headers Variable des HttpFoundation\Response zu setzen.

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

Hallo ich konfrontiert das gleiche Problem. Es scheint, als wäre es ein Fehler in Passport und es gibt viele Entwickler in der gleichen Situation. Ich habe gerade die Lösung für dieses Problem gefunden. Der Grund, warum wir diesen Fehler erhalten, ist, weil Response-Objekt, das wir in middleware bekommen, normalerweise eine Instanz der Illuminate\Http\Response Klasse ist, die wir Response-Header mit der Methode header('Header-Key', 'Header-Value') setzen können, während die Anfrage von Passport eine Instanz von Symfony\Component\HttpFoundation\Response ist, deshalb haben wir den Fehler bekommen Call to undefined method Symfony\Component\HttpFoundation\Response::header()

Unten ist der Code, den ich benutze, um diesen Fehler zu bekämpfen und jetzt funktioniert alles gut. Ich hoffe, dass es anderen Entwicklern hilft, die Idee zu bekommen, wie man es repariert und sich dann an ihren Code anpasst.

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

Und in meinem Kernel.php

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

Super Kumpel! Rettete mein Leben :) – jsd

+1

Die Illuminate-Antwort erstreckt sich von der Symfony-Antwort, so dass Sie die Antwort einfach so behandeln können, als wäre es die Symfony-Antwort, anstatt sie getrennt zu behandeln. –

Verwandte Themen