2017-04-24 1 views
6

Salut, j'utilisais un middleware cors qui semble fonctionner correctement jusqu'à ce que j'ajoute Laravel Passport maintenant il y a un problème avec ça .. il montre l'erreurAppel à la méthode indéfinie Symfony Component HttpFoundation Response :: header()

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

Ceci est mon 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; 
    } 

} 

la question est après la condition if .. Toute aide sera appreaciated grâce

+0

Pouvez-vous partager votre fichier 'composer.json' afin que nous puissions voir les versions de chaque bibliothèques? –

+0

s'il vous plaît essayez ceci: '$ réponse-> en-têtes-> ensemble ($ key, $ valeur)' –

+0

J'avais l'impression que le passeport géré CORS pour vous? – Joe

Répondre

3

Il semble que de votre application obtiennent le HttpFoundation\Response, qui n'a pas la méthode header. Donc, à la place, vous pouvez essayer de définir l'en-tête à la variable headers du HttpFoundation\Response.

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

Salut J'ai fait face au même problème. Il semble que c'était une erreur dans Passport et il y a beaucoup de développeurs dans la même situation. Je viens de trouver la solution à ce problème. La raison pour laquelle nous obtenons cette erreur est parce que l'objet de réponse que nous obtenons middleware est généralement une instance de Illuminate\Http\Response classe que nous pouvons définir en-têtes de réponse en utilisant la méthode header('Header-Key', 'Header-Value') alors que la demande traitée par Passport sera une instance de Symfony\Component\HttpFoundation\Response c'est pourquoi nous avons eu l'erreur Ci-dessous le code que j'utilise pour lutter contre cette erreur et maintenant tout fonctionne bien. J'espère que cela aidera les autres développeurs à trouver une solution et à s'adapter à leur code.

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

Et dans mon Kernel.php

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

Génial mec! J'ai sauvé ma vie :) – jsd

+1

La réponse d'Illuminate s'étend à partir de la réponse de Symfony, donc vous pouvez toujours traiter la réponse comme s'il s'agissait de la réponse de Symfony plutôt que de la traiter séparément. –