我在Laravel 5中使用全局中间件(barryvdh/Laravel-cors),但我只希望它在一个环境(dev)上活动。这是因为我只需要在开发环境中使用composer,所以它没有安装在生产中。
我注册了它在应用内核中有一个全局中间件,所以如果我试图在生产中部署我的应用程序(Class 'BarryvdhCorsCorsServiceProvider' not found
),我会出错。我知道为什么,但我正在寻找解决方案。
是否有任何方法可以在laravel 5中全局声明中间件,但仅在一个环境中需要?
我希望它足够清楚,如果没有,我可以编辑我的帖子:)
要实现这一点,只需在服务提供商中加载内核,然后调用pushMiddleware
或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);
}
}
}
到目前为止,我发现的最好的方法是检查内核中的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。我只是觉得这个干净一点。