仅为 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 但代替寻找更好的东西但是,我想把这个解决方案放在那里。希望对您有所帮助!
要实现这一点,只需在服务提供商中加载内核,然后调用 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);
}
}
}
我知道我来晚了一点,但我想贡献一些我在研究这个相同问题时学到的东西。我试图仅在调试模式关闭时才应用 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;
我在 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 但代替寻找更好的东西但是,我想把这个解决方案放在那里。希望对您有所帮助!
要实现这一点,只需在服务提供商中加载内核,然后调用 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);
}
}
}
我知道我来晚了一点,但我想贡献一些我在研究这个相同问题时学到的东西。我试图仅在调试模式关闭时才应用 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;