仅为 Laravel 5 中的一个环境启用全局中间件

Enable global middleware only for one environment in Laravel 5

我在 Laravel 5 (barryvdh/laravel-cors) 中使用全局中间件,但我只希望它在一个环境 (dev) 中处于活动状态。那是因为我只需要在开发环境中使用 composer,所以它没有安装在生产环境中。

我在 App Kernel 中注册了一个全局中间件,因此如果我尝试在生产中部署我的应用程序 (Class 'Barryvdh\Cors\CorsServiceProvider' not found),我会遇到错误。我知道为什么,但我正在寻找解决方案。

有没有办法在 laravel 5 中全局声明一个中间件,但只在一个环境中需要?

我希望它足够清楚,如果没有,我可以编辑我的 post:)

在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'
 ]

这应该可以解决。

到目前为止我发现的最好方法是检查内核中的 env('APP_ENV')

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

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

我的查询与您的查询相反 - 希望在生产环境中全局实施中间件,但不在本地开发环境中实施。我尝试了 EspadaV8 推荐的 __construct() 方法,但它确实对我有用,因为 env('APP_ENV') 未能 return 我可以测试的值。

我所做的是将我的中间件包含在内核 $middleware 数组中,然后在我的中间件的 handle($request, Closure $next) 方法中,我将我的所有代码括起来 - 除了 return $next($request); -以下:

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

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

}

也许相反的方法对您有用(即 === 而不是 !==)?

我怀疑这不是最好的解决方案 - 正如您所指出的,在内核中处理(或不处理)中间件的加载是理想的 class 但代替寻找更好的东西但是,我想把这个解决方案放在那里。希望对您有所帮助!

要实现这一点,只需在服务提供商中加载内核,然后调用 pushMiddlewareprependMiddleware

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

我知道我来晚了一点,但我想贡献一些我在研究这个相同问题时学到的东西。我试图仅在调试模式关闭时才应用 Spatie's Response Cache 包(这样在我开发时,我就不必经常清除缓存来查看更新)。我想将 \Spatie\ResponseCache\Middlewares\CacheResponse 中间件应用于 web 中间件组。为此,我听从了@ralphowino 的建议,但进行了以下更改:

AppServiceProvider.php

<?php

namespace App\Providers;

use App\Http\Kernel;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(Kernel $kernel)
    {
        if (!env('APP_DEBUG')) {
            $kernel->appendMiddlewareToGroup('web', '\Spatie\ResponseCache\Middlewares\CacheResponse');
        }
    }
}

希望这对某人有所帮助。

P.S。我意识到有很多方法可以完成我上面解释的 objective,例如自定义文档中的 Spatie 缓存配置文件。我只是觉得这样更干净一些。

我是 SO 的新手,所以我不能评论其他答案。我知道这是一个老话题,但多亏了搜索,你还是找到了它。

在已接受的答案中,一位用户提问:

When I try this in app/Http/Kernel.php I get ( ! ) Fatal error: Uncaught exception 'ReflectionException' with message 'Class App\Http\Application does not exist' in /home/vagrant/earthport/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 836

我也遇到了这个问题,基本上你只需要确保包含 类

use Illuminate\Contracts\Foundation\Application;
use Illuminate\Routing\Router;