Laravel маршрутизация не удалась - PullRequest
0 голосов
/ 08 февраля 2020

Я должен перенаправить на определенный Controller на основе URL.

Мой URL-адрес

http://localhost/project/public/category-1?tracker=category

Если строка запроса tracker равна category, тогда он должен перенаправить на ProductsController@category маршрут.

Я попытался использовать приведенный ниже код. Но это не работает.

Route::any('{name}', function () {
    if (Request::get("tracker") == "category")
        Route::get('{name}', 'ProductsController@category');
});

Но приведенный ниже код работает, когда не используется Route внутри if statement

Route::any('{name}', function () {
    if (AppHelper::decryptURL(Request::get("tracker")) == "category")
        return 1;
});

Приведенный выше код отображает 1 на веб-странице, но при использовании Route::get('{name}', 'ProductsController@category') вместо return 1 он возвращает пустую страницу.

Как это исправить. Есть ли проблемы в моем кодировании.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

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

namespace App\Http\Middleware;

use Closure;

class CheckTarget
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->tracker <= "category") {
            return redirect('name_of_your_route');
        }

        return $next($request);
    }
}

После того, как вы должны зарегистрировать новое Middleware в пределах App\Http\Kernel Класса, как этот

protected $routeMiddleware = [
    \\...
    'target' => auth' => \App\Http\Middleware\CheckTarget::class,
]

И для использования вы сделаете вот так

Route::any('{name}', function () {
    return view('your_view_file_name');
})
->middleware('target');
->name('any_name_you_want');


Route::any('{name}', function () {
    if (Request::get("tracker") == "category") {
        Route::get('{name}', 'ProductsController@category'); // Here you define another route instead of redirect
    }
});

В вашем В коде есть одна проблема, которая заключается в том, что вместо перенаправления пользователя на маршрут, который вы хотите, вы определяете другой Route внутри другого дескриптора маршрута, который является необычным и должен быть избежать . Для перенаправления вы должны использовать redirect помощник, который берет URL, на который Laravel будет перенаправлять

1 голос
/ 08 февраля 2020

Вы можете использовать

Route::any('{name}', function () {
    $tracker = $request->query('tracker');
    if($tracker === 'category') {
      return (new \App\Http\Controllers\ProductsController())->category();
    }
});

Или через внедрение зависимостей

Route::any('{name}', function (ProductsController $productsCtrl) {
    $tracker = $request->query('tracker');
    if($tracker === 'category') {
      return $productsCtrl->category();
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...