Php 在Laravel 5中仅为一个环境启用全局中间件
我在Laravel5(barryvdh/LaravelCors)中使用了一个全局中间件,但我只希望它在一个环境(dev)上处于活动状态。这是因为我只需要在dev环境中使用composer,所以它没有安装在生产环境中 我在应用程序内核中注册了一个全局中间件,因此如果我尝试在生产环境中部署我的应用程序,就会出现错误(Php 在Laravel 5中仅为一个环境启用全局中间件,php,laravel,composer-php,laravel-5,Php,Laravel,Composer Php,Laravel 5,我在Laravel5(barryvdh/LaravelCors)中使用了一个全局中间件,但我只希望它在一个环境(dev)上处于活动状态。这是因为我只需要在dev环境中使用composer,所以它没有安装在生产环境中 我在应用程序内核中注册了一个全局中间件,因此如果我尝试在生产环境中部署我的应用程序,就会出现错误(Class'Barryvdh\Cors\CorsServiceProvider'未找到)。我知道为什么,但我正在寻找解决办法 有没有办法在laravel 5中全局声明中间件,但只在一个环
Class'Barryvdh\Cors\CorsServiceProvider'未找到
)。我知道为什么,但我正在寻找解决办法
有没有办法在laravel 5中全局声明中间件,但只在一个环境中需要
我希望这足够清楚,如果不清楚,我可以编辑我的帖子:)在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')无法返回我可以测试的值 我所做的是将我的中间件包含在内核$middleware数组中,然后在中间件中的
句柄($request,Closure$next)
方法中,我将我的所有代码都括起来,除了return$next($request)代码>-具有以下内容:
if(env('APP_ENV') !== 'local') {
.......middleware code.......
}
也许相反的方法对你有效(即===而不是!==)
我怀疑这不是最好的解决方案-正如您所指出的,在内核类中处理中间件的加载(或不加载)将是理想的,但我认为应该将此解决方案放在那里,而不是找到更好的解决方案。希望有帮助 要实现这一点,只需在服务提供商中加载内核,然后调用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\ResponseCache\middleware\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');
}
}
}
谢谢。我不能在这里使用“$this”::只使用$app->怎么样。。。或者只是app()->在类的内联属性声明中不能使用常量以外的任何东西。但是,您也可以轻松地实现一个构造函数,设置此值,然后在app/Http/Kernel.php中尝试此操作时调用父构造函数,我得到(!)致命错误:第836行的/home/vagrant/earthport/vendor/laravel/framework/src/illighte/Container/Container.php中的未捕获异常“ReflectionException”和消息“Class App\Http\Application not Existence”(类App不存在)。