2015-02-11 10 views
7

Sto utilizzando un middleware globale in Laravel 5 (barryvdh/laravel-cors) ma voglio solo che sia attivo su un ambiente (dev). Questo perché lo richiedo solo con compositore in dev environmentnement, quindi non è installato in produzione.Abilita il middleware globale solo per un ambiente in Laravel 5

Ho registrato che ha un middleware globale nel kernel dell'app e quindi ho un errore se provo a distribuire la mia app in produzione (Class 'Barryvdh\Cors\CorsServiceProvider' not found). So perché, ma sto cercando una soluzione.

C'è un modo per dichiarare un middleware globalmente in laravel 5 ma richiesto solo in un ambiente?

Spero che sia abbastanza chiaro, posso modificare il mio post se non :)

risposta

1

Il modo migliore che ho trovato finora è quello di verificare ENV ('APP_ENV') nel Kernel

public function __construct(Application $app, Router $router) 
{ 
    if (env('APP_ENV', 'production') === 'local') { 
     $this->prependMiddleware('Clockwork\Support\Laravel\ClockworkMiddleware'); 
    } 

    parent::__construct($app, $router); 
} 
+0

Quando provo questo in app/Http/Kernel.php ottengo (!) Fatal errore: eccezione Uncaught 'ReflectionException' con messaggio 'App di classe \ Http \ L'applicazione non esiste' in /home/vagrant/earthport/vendor/laravel/framework/src/Illuminate/Container/Container.php sulla riga 836 – HowApped

+0

Dovrebbe essere ' App :: IsLocal() '. – goyote

0

Nel file kernel.php

//... 
protected middleware = [ 
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 
    'Illuminate\Cookie\Middleware\EncryptCookies', 
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 
    'Illuminate\Session\Middleware\StartSession', 
    'Illuminate\View\Middleware\ShareErrorsFromSession', 
    'App\Http\Middleware\VerifyCsrfToken', 
    (!$this->app->environment('local')) ?: 'Path/To/Package' 
] 

Questo dovrebbe risolvere.

+0

Grazie. Non posso usare "$ this" qui:/ –

+0

come circa solo $ app-> ... o semplicemente app() -> –

0

ho avuto la query opposta alla tua - che vogliono implementare il middleware a livello globale nella produzione, ma non in sviluppo locale. Ho provato il metodo __construct() consigliato EspadaV8, ma ha funzionato per me come env ('APP_ENV') non è riuscito a restituire un valore che potrei testare.

Quello che ho fatto, invece è stato quello di inserire il mio middleware nella matrice middleware Kernel $ e poi, nel metodo handle($request, Closure $next) nel mio middleware, io tra parentesi tutto il mio codice - tranne return $next($request); - con il seguente:

if(env('APP_ENV') !== 'local') { 

.......middleware code....... 

} 

Forse il contrario potrebbe funzionare per voi (cioè === invece di! ==)?

Sospetto che questa non sia la soluzione migliore - come si fa notare, sarebbe ideale per gestire il caricamento del middleware (o meno) nella classe Kernel ma invece di trovare qualcosa di meglio finora, ho pensato per mettere questa soluzione là fuori Spero che sia d'aiuto!

2

Per raggiungere questo kernel carico semplicemente il fornitore del servizio quindi chiamare sia pushMiddleware o prependMiddleware

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot(Kernel $kernel) 
    { 
     if ($this->app->environment() === 'dev') { 
      $kernel->prependMiddleware(ClockworkMiddleware::class); 
     } 
    } 
} 
Problemi correlati