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



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

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

是否有任何方法可以在laravel 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);
        }
    }
}

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

public function __construct(Application $app, Router $router)
{
    if (env('APP_ENV', 'production') === 'local') {
        $this->prependMiddleware('ClockworkSupportLaravelClockworkMiddleware');
    }
    parent::__construct($app, $router);
}

在kernel.php文件中

 //...
 protected middleware = [
    'IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode',
    'IlluminateCookieMiddlewareEncryptCookies',
    'IlluminateCookieMiddlewareAddQueuedCookiesToResponse',
    'IlluminateSessionMiddlewareStartSession',
    'IlluminateViewMiddlewareShareErrorsFromSession',
    'AppHttpMiddlewareVerifyCsrfToken',
    (!$this->app->environment('local')) ?: 'Path/To/Package'
 ]

这应该可以解决。

我是SO的新手,所以我不允许评论其他答案。我知道这是一个老话题,但感谢搜索,你仍然可以找到它。

在接受的答案中,用户问道:

当我在app/Http/Kernel.php中尝试此操作时,我会得到(!)致命错误:未捕获的异常"ReflectionException",消息为"Class app\Http\Application not exists",位于/home/farranget/earthport/vender/laravel/framework/src/IIlluminate/Container/Contain.php的第836行

我也有这个问题,基本上你只需要确保包括类

use IlluminateContractsFoundationApplication;
use IlluminateRoutingRouter;

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

相反,我所做的是将我的中间件包含在Kernel$middleware数组中,然后在中间件的handle($request, Closure $next)方法中,我将除return $next($request);之外的所有代码都括起来,并使用以下内容:

if(env('APP_ENV') !== 'local') { 
.......middleware code.......
}

也许相反的情况对你有用(即==而不是!==)?

我怀疑这不是最好的解决方案——正如你所指出的,在Kernel类中处理中间件的加载(或不处理)是理想的,但我想把这个解决方案放在那里,而不是找到更好的解决方案。希望它能有所帮助!

我知道我参加聚会有点晚了,但我想贡献我在研究这个问题时学到的东西。只有在调试模式关闭的情况下,我才尝试应用Spatie的响应缓存包(这样在开发过程中,我就不必经常清除缓存来查看更新)。我想将SpatieResponseCacheMiddlewaresCacheResponse中间件应用于web中间件组。为了做到这一点,我听从了@ralphowino的建议,但做了以下更改:

AppServiceProvider.php

<?php
namespace AppProviders;
use AppHttpKernel;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot(Kernel $kernel)
    {
        if (!env('APP_DEBUG')) {
            $kernel->appendMiddlewareToGroup('web', 'SpatieResponseCacheMiddlewaresCacheResponse');
        }
    }
}

希望这能帮助到别人。

附言:我意识到有很多方法可以实现我上面解释的目标,比如自定义文档中的Spatie Cache Profile。我只是觉得这个干净一点。

相关内容

最新更新