Hola, estaba usando un cors middleware que parece funcionar bien hasta que agregué Laravel Passport ahora hay un problema con él ... muestra el error
Call to undefined method Symfony\Component\HttpFoundation\Response::header() on line number 36Este es mi software intermedio:
<?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; } }el problema es después de la condición if .. Cualquier ayuda será apreciada gracias
Hola, me enfrenté al mismo problema. Parece que fue un error en Passport y hay muchos desarrolladores en la misma situación. Acabo de encontrar la solución a este problema. La razón por la que recibimos este error es porque el objeto de respuesta que obtenemos en el middleware suele ser una instancia de la clase Illuminate\Http\Response que podemos establecer encabezados de respuesta usando el encabezado del método header('Header-Key', 'Header-Value') mientras que la solicitud manejada por Passport será una instancia de Symfony\Component\HttpFoundation\Response , por eso obtuvimos el error Call to undefined method Symfony\Component\HttpFoundation\Response::header()
A continuación se muestra el código que utilizo para abordar este error y ahora todo funciona bien. Espero que ayude a otros desarrolladores a hacerse una idea de cómo solucionarlo y luego adaptarlo a su código.
$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; Y en mi Kernel.php
protected $middleware = [ \App\Http\Middleware\Cors::class, // .... ];Parece que desde su aplicación está obteniendo HttpFoundation\Response , que no tiene el método de header . Entonces, en su lugar, puede intentar establecer el encabezado en la variable de headers de HttpFoundation\Response .
foreach ($headers as $key => $value) $response->headers->set($key, $value); return $response;Tengo este problema cuando hice esto
return Response::stream($callback, 200, $headers);Lo resuelvo simplemente colocando una barra inclinada ( \ ) antes de Respuesta como esta:
return \Response::stream($callback, 200, $headers);Pruebe esta solución: Gracias