2017-04-24 20 views
6

こんにちは私はLaravel Passportを追加するまでうまくいくように見えるcorsミドルウェアを使用していましたが、現在問題があります..エラー未定義のメソッドを呼び出す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; 
    } 

} 

条件ならば...すべてのヘルプは感謝

+0

にあなたの 'composer.json'ファイルを共有することはできますか? –

+0

これを試してください: '$ response-> headers-> set($ key、$ value)' –

+0

パスポートがCORSを扱っているという印象を受けましたか? – Joe

答えて

3

をappreaciatedされますそれはあなたのアプリケーションから、あなたと思われた後、問題がありますHttpFoundation\Responseが取得されていますが、これにはheaderメソッドがありません。したがって、HttpFoundation\Responseの変数headersにヘッダーを設定しようとすることができます。

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

こんにちは、私は同じ問題に直面しました。それはPassportのエラーであり、多くの開発者が同じ状況にあるようです。私はちょうどこの問題の解決策を見つけました。このエラーが発生する理由は、middlewareにあるResponseオブジェクトが通常Illuminate\Http\Responseクラスのレスポンスヘッダーであるため、header('Header-Key', 'Header-Value')というメソッドを使用してレスポンスヘッダーを設定できるのに対し、Passportで処理されるリクエストは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; 

そして、我々は、各librairiesのバージョンを見ることができるように、私のKernel.php

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

恐ろしい男!私の人生を保存しました:) – jsd

+1

IlluminateレスポンスはSymfonyレスポンスから拡張されているので、レスポンスを別々に処理するのではなく、常にSymfonyレスポンスとして扱うことができます。 –

関連する問題