次の問題が発生しました。ルート/ getImage/{id}に画像を返したいのですが、関数は次のようになります。
public function getImage($id){
$image = Image::find($id);
return response()->download('/srv/www/example.com/api/public/images/'.$image->filename);
}
私がこれをするとき、それは私にこれを返します:
FatalErrorException in HandleCors.php line 18:
Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()
use Response;
コントローラーの先頭。 HandleCors.phpが問題だとは思わないが、とにかく:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Http\Response;
class CORS implements Middleware {
public function handle($request, Closure $next)
{
return $next($request)->header('Access-Control-Allow-Origin' , '*')
->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
}
}
Laravelドキュメントに記載されているとおりなので、これがなぜ起こるのか実際にはわかりません。エラーが発生したときにLaravelを更新しましたが、これは修正しないでください。
問題は、その関数を持たないResponse
オブジェクト(_Symfony\Component\HttpFoundation\BinaryFileResponse
_クラス)で->header()
を呼び出していることです。 ->header()
関数は 特性の一部 であり、Laravelの 応答クラス によって使用され、基本のsymfony応答ではありません。
幸い、headers
プロパティにアクセスできるので、次のようにできます。
_$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
_
リクエストの提出に応答する場合、これらのタイプのリクエストにはヘッダーを設定せず、他のすべてのネイティブレスポンスタイプにヘッダーを設定することができます。
これは、返されたheader
にclosure
メソッドが存在することを確認することで実行できます。
現在のクロージャーインスタンスでheader
メソッドを使用できない場合は、別の方法をとることができます。
public function handle($request, Closure $next)
{
$handle = $next($request);
if(method_exists($handle, 'header'))
{
$handle->header('Access-Control-Allow-Origin' , '*')
->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
}
return $handle;
}