嗨,我正在使用 cors 中间件,它似乎工作正常,直到我添加了 Laravel Passport,现在它出现了问题..它显示了错误
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;
}
}
问题是在 if 条件之后..任何帮助将不胜感激,谢谢
嗨,我遇到了同样的问题。看来这是 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;
在我的
Kernel.php
protected $middleware = [
\App\Http\Middleware\Cors::class,
// ....
];
似乎从您的应用程序中获得了
HttpFoundation\Response
,它没有 header
方法。因此,您可以尝试将标题设置为 headers
的 HttpFoundation\Response
变量。
foreach ($headers as $key => $value)
$response->headers->set($key, $value);
return $response;
我这样做的时候遇到了这个问题
return Response::stream($callback, 200, $headers);
我通过简单地在响应之前添加斜杠(\)来解决这个问题,如下所示:
return \Response::stream($callback, 200, $headers);
尝试这个解决方案:谢谢
有2个响应对象:
Passport 返回 Symfony 的响应对象。
Laravel 的响应对象扩展了 Symfony 的响应对象,并添加了一些方便的方法,例如
header()
,但是该方法并未在 Symfony 的响应对象上定义。
你可以简单地使用 Symfony 的底层方法(laravel 扩展的):
$response->headers->set($key, $value);
我通过将项目放在桌面上来解决它。因此,如果您的项目位于桌面或其他位置的文件夹内,只需将其从那里删除并放入桌面即可。