Solución:
Cree un middleware como sugirió Alexander Lichter que establezca el Accept
encabezado en cada solicitud:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class ForceJsonResponse
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}
Añádelo a $routeMiddleware
en el app/Http/Kernel.php
expediente:
protected $routeMiddleware = [
(...)
'json.response' => AppHttpMiddlewareForceJsonResponse::class,
];
Ahora puede envolver todas las rutas que deberían devolver JSON:
Route::group(['middleware' => ['json.response']], function () { ... });
Editar: para Laravel 6.9+
Dar el json.response
Prioridad de middleware sobre otros middlewares: para manejar casos en los que la solicitud es terminada por otros middlewares (como el Authorize
middleware) antes de configurar el Accept
encabezamiento.
Para hacer esto, anule el constructor de usted AppHttpKernel
clase (app/Http/Kernel.php
) con:
public function __construct( Application $app, Router $router ) {
parent::__construct( $app, $router );
$this->prependToMiddlewarePriority(AppHttpMiddlewareForceJsonResponse::class);
}
Regresar JSON
en el controlador solo return $data;
Para JSON
respuesta sobre errores, vaya a appExceptionsHandler.php
archivo y mire el render
método.
Debería poder volver a escribirlo para que se parezca a esto:
public function render($request, Exception $e)
{
// turn $e into an array.
// this is sending status code of 500
// get headers from $request.
return response()->json($e, 500);
}
Sin embargo, tendrá que decidir qué hacer con $e
, porque necesita ser un array
. También puede configurar el código de estado y la matriz de encabezado.
Pero luego, ante cualquier error, devolverá un JSON
respuesta.
Editar: También es bueno tener en cuenta que puede cambiar el report
método para manejar cómo laravel registra el error también. Más info aquí.
Sé que esto ha sido respondido, pero estas no son buenas soluciones porque cambian el código de estado de manera impredecible. la mejor solución es agregar los encabezados apropiados para que Laravel devuelva JSON (creo que es Accept: application/json
), o siga este gran tutorial para decirle siempre a Laravel que devuelva JSON: https://hackernoon.com/always-return-json-with-laravel-api-870c46c5efb2
Probablemente también podría hacer esto a través de middleware si quisiera ser más selectivo o adaptarse a una solución más compleja.