2017-04-24 77 views
6

Merhaba, Laravel Passport'u ekleyene kadar iyi çalıştığım bir cors middleware kullanıyordum, şimdi bir sorun var ..Tanımlanmamış yönteme çağrı Symfony Component HttpFoundation Response :: header()

hatasını gösteriyor
Call to undefined method Symfony\Component\HttpFoundation\Response::header() on line number 36 

Bu benim ara yazılımdır: sorun varsa duruma sonra .. Herhangi bir yardım görünüyor sayesinde

+0

Eğer 'composer.json' dosyasını paylaşabilir miyim? –

+0

lütfen şunu deneyin: '$ response-> headers-> set ($ anahtar, $ değer)' –

+0

Pasaportun sizin için CORS tarafından ele alındığı izlenimindeyim? – Joe

cevap

3

appreaciated edilecek olan

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

} 

senin uygulamadan sen header yöntemine sahip olmayan HttpFoundation\Response alıyor. Bunun yerine, üstbilgiyi HttpFoundation\Response'un headers değişkenine ayarlamayı deneyebilirsiniz.

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

Merhaba Ben de aynı sorunla karşılaştım. Pasaportta bir hata gibi görünüyor ve birçok geliştirici aynı durumda. Bu sorunun çözümünü yeni buldum. Bu hatayı almamın nedeni, middleware'a aldığımız Yanıt nesnesinin genellikle Illuminate\Http\Response sınıfının bir örneğidir, header('Header-Key', 'Header-Value') yöntemini kullanarak Yanıt üstbilgileri ayarlayabiliriz, ancak Passport tarafından ele alınan İstek Symfony\Component\HttpFoundation\Response örneğidir ve bu yüzden hatayı aldık Call to undefined method Symfony\Component\HttpFoundation\Response::header()

Bu hata ile mücadele etmek için kullandığım kod aşağıdadır ve şimdi her şey düzgün çalışıyor. Umarım diğer geliştiricilerin fikrin nasıl düzeltileceğine ve daha sonra kodlarına uyum sağlamasına yardımcı olur.

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

Ve içinde

benim her librairies sürümlerini görebilirsiniz Kernel.php

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

Müthiş dostum! Hayatımı kurtardım :) – jsd

+1

Illuminate yanıtı Symfony yanıtından uzanıyor, böylece cevabı her zaman ayrı ayrı ele almak yerine Symfony yanıtı gibi davranıyorsunuz. –