2015-02-11 19 views
7

Tôi đang sử dụng phần mềm trung gian toàn cầu trong Laravel 5 (barryvdh/laravel-cors) nhưng tôi chỉ muốn nó hoạt động trên một môi trường (dev). Đó là bởi vì tôi chỉ yêu cầu nó với nhà soạn nhạc trong dev environnement, vì vậy nó không được cài đặt trong sản xuất.Bật phần mềm trung gian toàn cầu chỉ cho một môi trường trong Laravel 5

Tôi đã đăng ký nó có phần mềm trung gian toàn cầu trong Hạt nhân ứng dụng và vì vậy tôi gặp lỗi nếu cố gắng triển khai ứng dụng của mình trong sản xuất (Class 'Barryvdh\Cors\CorsServiceProvider' not found). Tôi biết tại sao, nhưng tôi đang tìm một giải pháp.

Có cách nào để khai báo một phần mềm trung gian trên toàn cầu trong laravel 5 nhưng chỉ yêu cầu trong một môi trường không?

Tôi hy vọng nó đủ rõ ràng, tôi có thể chỉnh sửa bài viết của tôi nếu không muốn nói :)

Trả lời

1

Cách tốt nhất mà tôi đã tìm thấy cho đến nay là để kiểm tra env ('APP_ENV') trong 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

Khi tôi thử điều này trong app/Http/Kernel.php tôi nhận được (!) Fatal lỗi: Uncaught ngoại lệ 'ReflectionException' với thông báo 'Class App \ Http \ Application không tồn tại' trong /home/vagrant/earthport/vendor/laravel/framework/src/Illuminate/Container/Container.php trên dòng 836 – HowApped

+0

Nên là ' Ứng dụng :: isLocal() '. – goyote

0

Trong tập tin 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' 
] 

này nên giải quyết.

+0

Cảm ơn. Tôi không thể sử dụng "$ this" ở đây:/ –

+0

làm thế nào về chỉ $ app-> ... hoặc đơn giản là app() -> –

0

Tôi đã truy vấn ngược lại với bạn - muốn thực hiện middleware trên toàn cầu trong sản xuất nhưng không phải trong phát triển địa phương. Tôi đã thử phương thức __construct() mà EspadaV8 đề nghị nhưng nó đã làm việc cho tôi khi env ('APP_ENV') thất bại trong việc trả về một giá trị mà tôi có thể kiểm tra.

Những gì tôi đã thay là bao gồm middleware của tôi trong middleware mảng Kernel $ và sau đó, trong handle($request, Closure $next) phương pháp trong middleware của tôi, tôi được phơi sáng tất cả các mã của tôi - trừ return $next($request); - như sau:

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

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

} 

Có lẽ điều ngược lại sẽ làm việc cho bạn (tức là === thay vì! ==)? Tôi nghi ngờ đây không phải là giải pháp tốt nhất - như bạn chỉ ra, nó sẽ là lý tưởng để xử lý việc tải phần mềm trung gian (hoặc không) trong lớp Kernel nhưng thay vì tìm kiếm một cái gì đó tốt hơn, tôi nghĩ để đưa giải pháp này ra khỏi đó. Hy vọng nó giúp!

2

Để đạt được điều này chỉ đơn giản là tải hạt nhân trong các nhà cung cấp dịch vụ sau đó gọi một trong hai pushMiddleware hoặc 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); 
     } 
    } 
} 
Các vấn đề liên quan