Редирект на view('welcome'), если запрос http в laravel

Друзья, такой вопрос. Я использую reactJs на frontend и laravel на beckend. Стоит задача разграничения ajax и http запросов. Вот этот код решает задачу (метод контроллера):

   public function index(Request $request)
{
    if($request->ajax()){
        $snippet = Snippet::all();
        return Response()->json($snippet);
    } else {
        return view('welcome');
    }

}

но мне хочется более красивый вариант с точки зрения архитектуры, т.к. не комильфо писать в каждом экшене контроллера условные конструкции. Хотелось бы один раз проверить что $request это http и перенаправить пользователя на view('welcome'). Искал решение чтобы выполнить такую проверку в файле routes/web.php перед объявлением всех роутов, но ничего не получилось. Если не перенаправлять пользователя на 'welcome', где находятся входные скрипты reactJs, то пользователь получает голый json.


Ответы (1 шт):

Автор решения: Dmitrii Sedov

В качестве решения Вашей проблемы предлагаю использовать middleware. Но подключать шаблон если не корректный запрос, не совсем верно, нужно делать именно редирект (который Вы так и называете). Создайте страницу ошибки или страницу welcome и делайте редирект туда. Например:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRequest
{
    
    public function handle($request, Closure $next)
    {
        if (!$request->ajax()) return redirect('welcome');

        return $next($request);
    }
}

Далее регистрируете данный middleware в конфиге и делаете так:

Route::middleware('check.request')->group(function () {
    //Все запросы которые должны выполняться по ajax
});

UPD если Вы пытаетесь достичь SPA приложения, то все запросы должен обрабатывать один контроллер который возвращает Вашу welcome страницу. Маршрут должен быть таким:

Route::get('/{any?}', 'MyController@index')->where('any','.*');

Все запросы идут на 1 контроллер и далее в нем делаете так:

...index(Request $request) {
    return view('welcome');
}

И далее у вас должен Быть подключен router который уже смотрит на url и подключает тот компонент который соответствует шаблону! и там в методе componentDidMount Вы грузите Ваши ajax. В результате проверки на бэке не нужны!

→ Ссылка