2017-04-24 10 views
6

안녕하세요, Laravel Passport를 추가 할 때까지 제대로 작동하는 것처럼 보이는 cors 미들웨어를 사용하고 있습니다. 문제가 있습니다 ..정의되지 않은 메서드를 호출합니다. Symfony Component HttpFoundation Response :: header()

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

이 내 미들웨어 : 문제가있는 경우 조건 후 ... 어떤 도움 것 같다 덕분에

+0

당신이 당신의'composer.json' 파일을 공유 할 수 있습니까? –

+0

다음을 시도해보십시오 :'$ response-> headers-> set ($ key, $ value)' –

+0

여권이 CORS를 취급한다는 인상하에 있었습니까? – Joe

답변

3

을 appreaciated 될 것이다

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

} 

당신의 응용 프로그램에서 당신 HttpFoundation\Response을 얻고 있는데, header 방법이 없습니다. 그래서 HttpFoundation\Response 변수 인 headers으로 헤더를 설정할 수 있습니다.

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

안녕하세요. 저는 같은 문제에 직면했습니다. 그것은 여권에 오류가있는 것 같아 많은 개발자가 같은 상황에 있습니다. 방금이 문제에 대한 해결책을 찾았습니다. 이 오류가 발생하는 이유는 middleware에있는 응답 객체가 보통 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 응답 인 것처럼 취급 할 수 있습니다. –