Промежуточное ПО группового маршрута не вызывается

То, что я пытаюсь сделать, это сгруппировать несколько префиксов с одним промежуточным программным обеспечением:

Route::group(['middleware' => ['centralize']], function () {
    Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
        Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
            Route::group(['prefix' => \App\Utilities\Centralization::setCity()], function () {
                Route::group(['prefix' => \App\Utilities\Centralization::setArea()], function () {

                    //routes
                });
            });

        });
    });
}); 

Я добавил промежуточное ПО centralize в kernel:

protected $routeMiddleware = [
    ...
    'centralize'=> \App\Http\Middleware\Centralize::class,
    ...
];

Но промежуточное ПО вообще не вызывается, здесь чего-то не хватает?

Обновлено: он идет прямо к виду на дом, я делаю dd внутри middleware, но он никогда не доходит до него!

Обновлено: код промежуточного программного обеспечения:

<?php

namespace App\Http\Middleware;

use App\Utilities\Centralization;
use Closure;
use Illuminate\Http\RedirectResponse;

class Centralize
{
    /**
     * @var  \Illuminate\Http\Request
     */
    private $request;

    /**
     * @var  array
     */
    private $params;

    private $location;

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle(\Illuminate\Http\Request $request, Closure $next)
    {
        $this->request = $request;

        dd('hit');

        $this->params = explode('/', $request->getPathInfo());


        $this->figureLocale();
        $this->figureCountry();
        $this->figureCity();
        $this->figureArea();
        $this->figureLocation();

        $redirection = implode('/', $this->params);

        if ($request->getPathInfo() !== $redirection) {

            return new RedirectResponse($redirection, 302, ['Vary' => 'Accept-Language']);
        }

        \View::share([
            'countries' => Centralization::getCountries(),
            'cities' => Centralization::getCities(),
            'areas' => Centralization::getAreas(),
            'location' => $this->location
        ]);

        return $next($request);
    }

    private function figureLocale()
    {
        //...
    }

    private function figureCountry()
    {
       //..
    }

    private function figureCity()
    {
       //...
    }

    private function figureArea()
    {
        //...
    }

    private function figureLocation()
    {
        //...
    }
}

Обновлено: я также пробовал:

Route::middleware(['centralize'])->group(function () {
    Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
        Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
            Route::group(['prefix' => \App\Utilities\Centralization::setCity()], function () {
                Route::group(['prefix' => \App\Utilities\Centralization::setArea()], function () {
//..
                });
            });

        });
    });
});

Но с тем же результатом он никогда не попадает в промежуточное ПО!

Обновлено: очистка кеша с помощью artisan и вручную тоже не работает!

Какое сообщение вы получите

MD. Jubair Mizan 12.02.2019 08:36

@ MD.JubairMizan MD.JubairMizan он идет прямо к представлению home, я делаю dd внутри промежуточного программного обеспечения, но он никогда не достигает этого!

Abanoub 12.02.2019 08:39

Добавьте свой код middleware с вопросом.

Manzurul Hoque Rumi 12.02.2019 08:45

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

Mihir Bhende 12.02.2019 08:55

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

Sagar Gautam 12.02.2019 08:56

Добавлен промежуточный код!

Abanoub 12.02.2019 08:58

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

Sagar Gautam 12.02.2019 09:04

Очистите кэш и повторите попытку. php artisan cache:clear

Manzurul Hoque Rumi 12.02.2019 09:09

очистка кеша тоже не помогает!

Abanoub 12.02.2019 09:12
it goes directly to the view of the home - вы не показали нам свой маршрут home.
Don't Panic 12.02.2019 09:23

@Don'tPanic, это просто Route::get('/', 'HomeController@index')->name('home');

Abanoub 12.02.2019 10:00

Важный момент - где это? Если он не входит в показанные вами группы, промежуточное ПО centralize вызываться не будет. Но если он находится внутри групп, это никогда не сработает, потому что у вас есть все эти префиксы. Итак, где это?

Don't Panic 12.02.2019 10:04

@Don'tPanic, это внутри префиксов, разве его не следует вызывать независимо от того, имеет ли URL-адрес эти префиксы или нет, поскольку все они сгруппированы в middleware?

Abanoub 12.02.2019 10:07

Нет - если он внутри префиксов, значит у вас определен маршрут для чего-то вроде /fr/france/paris/somewhere/, но у вас нет маршрута для /. Поэтому, если вы попытаетесь получить доступ к /, ваше промежуточное ПО не будет запущено, и я предполагаю, что вы получите 404.

Don't Panic 12.02.2019 10:09

@Abanoub это имеет смысл? Я добавил резюме и некоторые подробности в качестве ответа.

Don't Panic 12.02.2019 10:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
15
315
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В маршрутах/web.php

Route::group(['middleware' => ['centralize']], function () {
  Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
    Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
          //routes
         });
    });
});

В приложении/Http/kernal.php

protected $routeMiddleware = [
    'centralize' => \App\Http\Middleware\CentralizeMiddleware::class,
  ];

В приложении/Http/Middleware/CentralizeMiddleware.php

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CentralizeMiddleware
{
    public function handle($request, Closure $next)
    {
        if (//Your Condition) {
            //If true
        }
        else {
        return $next($request);
        }
    }
}
Ответ принят как подходящий

Вы упомянули в одном редактировании, что:

it goes directly to the view of the home

Таким образом, URL-адрес, который вы посещаете, на самом деле /. И, как поясняется в комментариях, «домашний» маршрут был определен внутри префиксов. Но это означает, что это действительно маршрут для чего-то вроде /fr/france/paris/somewhere/, а нет — маршрут для /.

prefix в маршруте означает, что «этот маршрут применяется к URI с этим префиксом». Если URI не включает этот префикс, эта маршрутизация не применяется.

Это означает, что маршрута для / нет, и его посещение:

  • не запускать промежуточное ПО centralize;

  • не найти подходящего маршрута, поэтому выдать 404;

Если вы хотите применить промежуточное ПО centralize к домашнему маршруту, вам нужно разместить его внутри этой группы, но вне префиксов:

Route::middleware(['centralize'])->group(function () {

    Route::get('/', 'HomeController@index')->name('home');

    Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
        // ... 
    });
});

Другие вопросы по теме