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

时间:2015-02-11 11:08:12

标签: php laravel composer-php laravel-5

我在Laravel 5中使用全球中间件(barryvdh / laravel-cors),但我只希望它在一个环境(dev)上运行。那是因为我只需要在开发环境中使用作曲家,所以它没有安装在制作中。

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

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

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

4 个答案:

答案 0 :(得分:5)

要实现此目的,只需在服务提供商中加载内核,然后调用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);
        }
    }
}

答案 1 :(得分:0)

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

这应该解决。

答案 2 :(得分:0)

我到目前为止找到的最好方法是检查内核中的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);
}

答案 3 :(得分:0)

我知道我参加聚会有点晚了,但是我想贡献我在研究这个相同问题时学到的东西。仅在关闭调试模式的情况下,我才尝试应用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。我意识到有很多方法可以实现上述目标,例如自定义文档中的Spatie Cache Profile。我只是觉得这样比较干净。