Включить глобальное промежуточное ПО только для одной среды в Laravel 5

Я использую глобальное промежуточное ПО в Laravel 5 (barryvdh/laravel-cors), но я хочу, чтобы оно было активным только в одной среде (dev). Это потому, что мне требуется только композитор в среде разработки, поэтому он не установлен в производстве.

Я зарегистрировал, что у него есть глобальное промежуточное ПО в ядре приложения, поэтому у меня возникает ошибка, если я пытаюсь развернуть свое приложение в рабочей среде (Class 'Barryvdh\Cors\CorsServiceProvider' not found). Я знаю почему, но я ищу решение.

Есть ли способ объявить промежуточное ПО глобально в laravel 5, но требуется только в одной среде?

Я надеюсь, что это достаточно ясно, я могу отредактировать свой пост, если нет :)


person rap-2-h    schedule 11.02.2015    source источник


Ответы (5)


Лучший способ, который я нашел до сих пор, - это проверить 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);
}
person EspadaV8    schedule 21.04.2015
comment
Когда я пытаюсь это сделать в app/Http/Kernel.php, я получаю (!) Неустранимая ошибка: необработанное исключение «ReflectionException» с сообщением «Класс App\Http\Application не существует» в /home/vagrant/earthport/vendor/laravel/ framework/src/Illuminate/Container/Container.php в строке 836 - person HowApped; 12.06.2015
comment
Должно быть App::isLocal(). - person goyote; 08.10.2015

Для этого просто загрузите ядро ​​​​в сервис-провайдере, а затем вызовите 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);
        }
    }
}
person ralphowino    schedule 28.06.2016

В файле 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'
 ]

Это должно решить.

person Helder Lucas    schedule 13.02.2015
comment
Спасибо. Я не могу использовать $this здесь :/ - person rap-2-h; 17.02.2015
comment
как насчет просто $app-› ... или просто app()-› - person Helder Lucas; 17.02.2015
comment
Вы не можете использовать ничего, кроме постоянного значения во встроенном объявлении свойства класса. Однако вы можете так же легко реализовать конструктор, который устанавливает это значение, а затем вызывает родительский конструктор. - person apokryfos; 19.10.2020

У меня был запрос, противоположный вашему: я хотел внедрить промежуточное ПО глобально в производство, но не в локальную разработку. Я попробовал метод __construct(), рекомендованный EspadaV8, но он сработал для меня, так как env('APP_ENV') не смог вернуть значение, которое я мог проверить.

Вместо этого я включил свое промежуточное программное обеспечение в массив $ промежуточного программного обеспечения ядра, а затем в методе handle($request, Closure $next) в своем промежуточном программном обеспечении я заключил в скобки весь свой код, кроме return $next($request);, со следующим:

if(env('APP_ENV') !== 'local') { 

.......middleware code.......

}

Возможно, у вас сработает обратное (т.е. === вместо !==)?

Я подозреваю, что это не лучшее решение - как вы указываете, было бы идеально обрабатывать загрузку промежуточного программного обеспечения (или нет) в классе ядра, но вместо того, чтобы найти что-то лучшее, я решил поставить это решение там. Надеюсь, поможет!

person murph    schedule 09.09.2015

Я знаю, что немного опаздываю на вечеринку, но я хотел поделиться чем-то, что я узнал, исследуя этот же вопрос. Я пытался применить пакет кэша ответов Spatie, только если режим отладки был Я разрабатывал, мне бы не пришлось постоянно чистить кеш, чтобы видеть обновления). Я хотел применить промежуточное ПО \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, как указано в документации. Я просто думаю, что это немного чище.

person BakerStreetSystems    schedule 19.10.2020