我在Laravel 5中使用全球中间件(barryvdh / laravel-cors),但我只希望它在一个环境(dev)上运行。那是因为我只需要在开发环境中使用作曲家,所以它没有安装在制作中。
我注册了它在App Kernel中有一个全局中间件,所以如果我尝试在生产中部署我的应用程序(Class 'Barryvdh\Cors\CorsServiceProvider' not found
),我会出错。我知道为什么,但我正在寻找解决方案。
有没有办法在laravel 5中全局声明中间件,但只在一个环境中需要?
我希望它足够清楚,如果没有,我可以编辑我的帖子:)
答案 0 :(得分: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);
}
}
}
答案 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。我只是觉得这样比较干净。