2015-02-11 14 views
7

Używam globalnego oprogramowania pośredniego w Laravel 5 (barryvdh/laravel-cors), ale chcę tylko, aby było aktywne na jednym environnement (dev). To dlatego, że wymagam tego tylko od kompozytora w środowisku dev, więc nie jest on instalowany w produkcji.Włącz globalne oprogramowanie pośrednie tylko w jednym środowisku w Laravel 5

Zarejestrowałem, że ma globalne oprogramowanie pośrednie w Kernelu aplikacji, więc mam błąd, jeśli próbuję wdrożyć moją aplikację w produkcji (Class 'Barryvdh\Cors\CorsServiceProvider' not found). Wiem dlaczego, ale szukam rozwiązania.

Czy istnieje sposób deklarowania oprogramowania pośredniego na świecie w wersji 5, ale wymagane tylko w jednym środowisku?

Mam nadzieję, że to wystarczająco jasne, mogę edytować post, jeśli nie :)

Odpowiedz

1

Najlepszym sposobem znalazłem tak daleko jest do sprawdzenia env („APP_ENV”) w jądrze

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

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

Kiedy próbuję tego w app/Http/Kernel.php otrzymuję (!) Fatal error: Uncaught wyjątek "ReflectionException" z komunikatem "App Class \ Http \ Application nie istnieje" w /home/vagrant/earthport/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 836 – HowApped

+0

Powinien być " App :: isLocal() '. – goyote

0

W pliku 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' 
] 

To powinno rozwiązać.

+0

Dzięki. Nie mogę użyć "$ this" tutaj:/ –

+0

jak o prostu $ app-> ... lub po prostu app() -> –

0

miałem naprzeciwko zapytanie do Ciebie - chcąc realizować middleware globalnie w produkcji, ale nie w rozwój lokalny. Próbowałem metody __construct() zalecanej przez EspadaV8, ale działało to dla mnie, ponieważ env ("APP_ENV") nie zwrócił wartości, którą mógłbym przetestować.

co zrobiłem, a nie było to moją middleware w middleware tablicy Kernel dolarów, a następnie w sposób w moim middleware handle($request, Closure $next), ja nawias wszystkich moich kodu - z wyjątkiem return $next($request); - z następujących powodów:

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

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

} 

Być może coś przeciwnego zadziałałoby dla ciebie (tj. === zamiast! ==)?

Podejrzewam, że to nie jest najlepsze rozwiązanie - jak zauważysz, byłoby idealnie poradzić sobie z ładowaniem oprogramowania pośredniego (lub nie) w klasie Kernela, ale zamiast znaleźć coś lepszego od tego czasu, pomyślałem aby wprowadzić to rozwiązanie. Mam nadzieję, że to pomoże!

2

Aby to osiągnąć po prostu obciążenie w jądro usługodawcy następnie zadzwonić albo pushMiddleware lub 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); 
     } 
    } 
} 
Powiązane problemy