Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel 5中仅为一个环境启用全局中间件_Php_Laravel_Composer Php_Laravel 5 - Fatal编程技术网

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

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中全局声明中间件,但只在一个环

我在Laravel5(barryvdh/LaravelCors)中使用了一个全局中间件,但我只希望它在一个环境(dev)上处于活动状态。这是因为我只需要在dev环境中使用composer,所以它没有安装在生产环境中

我在应用程序内核中注册了一个全局中间件,因此如果我尝试在生产环境中部署我的应用程序,就会出现错误(
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不存在)。