2015-02-10 12 views
8

Non riesco a capire come aggiungere intestazioni a una risposta da un middleware. Ho usato sia ->header(...) e ->headers->set(...), ma entrambi dà errori. Quindi come lo fai?Come si aggiungono le intestazioni a una risposta con un middleware?

Prima ho provato con

public function handle($request, Closure $next) { 
    $response = $next($request); 

    $response->headers->set('refresh', '5;url=' . route('foo')); 

    return $response; 
} 

che è lo stesso come in Illuminate\Http\Middleware\FrameGuard.php, ma che dà

chiamata a un set funzione membro() su un non-oggetto

Secondo ho provato con

public function handle($request, Closure $next) { 
    $response = $next($request); 

    $response->header('refresh', '5;url=' . route('foo')); 

    return $response; 
} 

ma che dà

Metodo [intestazione] non esiste in mostra.

Quindi, come si aggiungono le intestazioni di un middleware?

+1

Provare a eseguire il debug, eseguire il codice seguente echo get_class ($ response); print_r (get_class_methods ($ response)); Cosa vedi? –

+0

Seconda opzione funziona con '$ response-> header-> set ('refresh', '...')' invece di '$ response-> header ('refresh', '...')'. [Spiegazione] (http://stackoverflow.com/a/29289684/3549317) – cespon

risposta

3

Ho risolto questo problema utilizzando l'helper response.

use Illuminate\Http\RedirectResponse; 

$response = $next($request); 
$response = $response instanceof RedirectResponse ? $response : response($response); 

return $response->header('refresh', '5;url=' . route('foo')); 

Tutto il mio altro middleware sembra funzionare correttamente, quindi suppongo che vada bene.

+5

Probabilmente è meglio controllare per: 'instanceof Symfony \ Component \ HttpFoundation \ Response' in modo da ottenere ogni tipo di risposta coperta. – lukasgeiter

+0

Dovrebbe controllare contro 'Illuminate \ Http \ Response'? – Alex

3

Ecco una soluzione testata in laravel 5.0 per fissare le intestazioni alle rotte

Creare un file di middleware app/Http/Middleware/API.php

<?php namespace App\Http\Middleware; 
use Closure; 
class API { 

    public function handle($request, Closure $next) 
    { 

      $response = $next($request); 
      $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Content-Range, Content-Disposition, Content-Description, X-Auth-Token'); 
      $response->header('Access-Control-Allow-Origin', '*'); 
      //add more headers here 
      return $response; 
     } 
} 

Aggiungi middlewear al kernel di file aggiungendo queste righe a /app/Http/Kernel.php

protected $middleware = [ 
    //... some middleware here already 
    '\App\Http\Middleware\API',// <<< add this line if you wish to apply globally 
]; 
protected $routeMiddleware = [ 
    //... some routeMiddleware here already 
    'api' => '\App\Http\Middleware\API', // <<< add this line if you wish to apply to your application only 
]; 

Raggruppa i tuoi percorsi nel file di percorsi /app/Http/routes.php

Route::group(['middleware' => 'api'], function() { 
    Route::get('api', '[email protected]'); 
    //other routes 
}); 
Problemi correlati