Laravel 5 регистрирует промежуточное ПО от поставщика услуг пакета

В настоящее время я разрабатываю пакет в/для Laravel 5.
Мой пакет содержит пользовательское промежуточное ПО, и я хотел бы добавить его в $routeMiddlewarearray класса ядра из моего поставщика услуг пакета.
Но я могу' Кажется, я не нахожу способ сделать это.

Я попытался создать пользовательский класс, который расширяет класс ядра, а затем я могу объединить массив со своим массивом.
Но после выхода из конструктора это невозможно.

В L4 у вас было App::middleware, но эта функция больше не доступна в L5.

Может ли кто-нибудь, кто решил эту проблему, помочь мне решить эту проблему?

Пожалуйста, скажите мне, если мой вопрос недостаточно ясен, чтобы я мог его немного прояснить.


person Joren Van Hocht    schedule 13.04.2015    source источник
comment
Любые решения для этого?   -  person Anatoliy Arkhipov    schedule 25.04.2015
comment
Пока нет, я все еще ищу решение   -  person Joren Van Hocht    schedule 26.04.2015
comment
Думаю, я нашел это. Ваш провайдер должен расширить RouteServiceProvider, тогда он получит экземпляр $router с методом middleware. И мы можем использовать этот метод для регистрации промежуточных программ, как это происходит, когда вы помещаете их в Kernel: prntscr.com/6yau6n   -  person Anatoliy Arkhipov    schedule 26.04.2015
comment
Это оказалось даже проще, чем я думал. Вы можете просто позвонить app('router')->middleware('key', 'Value'); поставщику услуг.   -  person Anatoliy Arkhipov    schedule 27.04.2015
comment
Сделал трюк! Большое спасибо!   -  person Joren Van Hocht    schedule 11.05.2015
comment
@AnatoliyArkhipov Как насчет того, чтобы написать полный ответ?   -  person Jeemusu    schedule 07.09.2015
comment
@Jeemusu Я создал для тебя ответ.   -  person Joren Van Hocht    schedule 07.09.2015


Ответы (6)


Начиная с Laravel 5.4 (проверено до 5.8), вы должны вызывать следующую строку от поставщика услуг.

$this->app['router']->aliasMiddleware('my-package-middleware', \My\Package\Middleware::class);

Или вы можете использовать помощник app(), как показано ниже.

app('router')->aliasMiddleware('my-package-middleware', \My\Package\Middleware::class);
person mitchdav    schedule 24.03.2017
comment
Не уверен, что это именно тот путь. Поскольку вы должны сначала зарегистрировать промежуточное программное обеспечение и назначить ему массив промежуточного программного обеспечения - person Agil; 11.08.2019

Речь идет о Laravel 5.6.

/*In your package service provider*/
public function boot()
{
    /** @var Router $router */
    $router = $this->app['router'];
    $router->pushMiddlewareToGroup('web', MyPackage\Middleware\WebOne::class);
}
person Alexandr Shevchenko    schedule 19.04.2018
comment
Добавление в новую группу приводит к тому, что целевой класс [my_middleware] не существует, в то время как aliasMiddleware работает нормально - person ymakux; 03.02.2020

В поставщике услуг пакета вы можете получить доступ к экземпляру маршрутизатора следующим образом:

$this->app['router']

Затем вы можете зарегистрировать промежуточное ПО следующим образом:

$this->app['router']->middleware('middlewareName', 'your\namespace\MiddlewareClass');

вы помещаете этот код в метод регистрации вашего поставщика услуг.

person Joren Van Hocht    schedule 07.09.2015
comment
Этот код больше не работает. Раньше было, но больше нет. - person Theodore R. Smith; 19.07.2020

Вы можете сделать это двумя способами:

  • Зарегистрируйте свое промежуточное ПО у своего основного поставщика промежуточного ПО.
  • Зарегистрируйте промежуточное ПО внутри поставщика услуг вашего пакета.

давайте сначала попробуем create ваш файл TestMiddleware.php в папке пакета src и поместим его куда-нибудь, в моем случае я поместил его в папку Middle-ware, а затем добавил в автозагрузчик composer.json следующим образом:

"autoload": {

  "psr-4": {
            "Vendor\\Package\\Middleware": "packages/Vendor/Package/src/Middleware"
   }
}

И напишите свой общий промежуточный продукт:

namespace Vendor\Package\Middleware;

class TestMiddleware {

    public function handle( $request, Closure $next ) {
        echo 'hello, world!';
    }

}

А затем добавьте промежуточное ПО к промежуточному ПО вашего основного проекта, в Lumen вы должны добавить его следующим образом:

 $app->middleware([
    Vendor\Package\Middleware\TestMiddleware::class
 ]);

Добавить промежуточное ПО к поставщику услуг пакета

И второй способ: создайте промежуточное ПО и загрузите его в автозагрузчик, как в последнем примере, а затем создайте поставщика услуг и зарегистрируйте свое промежуточное ПО внутри метода загрузки:

public function boot()
{
        $this->app->middleware([
               \Vendor\Package\Middleware\TestMiddleware::class
        ]);
}

И, наконец, вы должны зарегистрировать своего поставщика услуг в своем основном проекте (пример Lumen).

  $app->register(Vendor\Package\TestServiceProvider::class);
person Mehdi Hosseini    schedule 02.03.2016

Решение для Lumen:

$this->app->middleware($middleware);
person Ostap Bregin    schedule 29.12.2020

Есть два способа зарегистрировать ПО промежуточного слоя пакета.

Первый способ — добавить промежуточное ПО в существующую группу промежуточного ПО следующим способом:

$this->middlewareGroup($group_name, $middleware_list)

И другим способом будет регистрация пользовательского промежуточного программного обеспечения и назначение вашего промежуточного программного обеспечения в эту группу.

$this->pushMiddlewareToGroup(*string* $group_name, $middleware_list)

Вы можете узнать больше по ссылкам ниже

группа промежуточного ПО:
https://laravel.com/api/5.5/Illuminate/Routing/Router.html#method_middlewareGroup

pushMiddlewareToGroup: https://laravel.com/api/5.5/Illuminate/Routing/Router.html#method_pushMiddlewareToGroup

person Agil    schedule 11.08.2019
comment
У вас, кажется, все наоборот. middlewareGroup для создания группы и pushMiddlewareToGroup для отправки в существующую группу. - person Martin; 07.10.2019
comment
@ Мартин, разве это не то, о чем я уже упоминал в своем ответе? Пожалуйста, внимательно прочитайте весь ответ, а не только строки кода. - person Agil; 19.11.2019
comment
Метод в вашей первой строке кода предназначен для регистрации группы промежуточного программного обеспечения, хотя прямо над ним написано pushing middleware into existing middleware group. - person Martin; 20.11.2019