AJAX-запрос к контроллеру ресурсов Laravel, лучшая практика - PullRequest
0 голосов
/ 03 декабря 2018

Я установил контроллер ресурсов в Laravel со следующей индексной функцией:

public function index()
{
    if (!Auth::check()) {
        return redirect()->route('login');
    }
    $decks = Auth::user()->decks->sortByDesc('name');
    return view('decks.index')->with('decks', $decks);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}

На другой странице мне также нужна переменная $decks через вызов AJAX.Сейчас я настроил дополнительный маршрут к своему контроллеру, из которого я могу получить колоды с помощью запроса GET:

public function getDecks()
{
    if (!Auth::check()) {
        return;
    }
    $decks = Auth::user()->decks->sortByDesc('name');
    return response()->json($decks);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}

Мой вопрос: Есть ли способ получить$decks переменная через запрос непосредственно к index или мое решение - путь?

Если я сделаю запрос get для индексации, я получу HTML-код представления decks.index, но как я могу это сделать?получить доступ (если возможно) к переменной $decks?

Наверное, я не совсем понимаю, что происходит: что происходит с $decks в операторе ->with('decks', $decks)?Я знаю, что могу затем получить доступ к $decks, используя синтаксис блейда на этой странице, но откуда он получает доступ к данным и могу ли я также обращаться к нему через AJAX?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Ваше решение - правильный путь.Обычно не рекомендуется обрабатывать какую-либо бизнес-логику или поиск данных с использованием ваших маршрутов - предпочтительным является использование контроллера, чем вы и занимаетесь.Если вы хотите избежать оператора if (Auth::check()) в вашем контроллере, вы можете добавить промежуточное программное обеспечение auth непосредственно к этому маршруту следующим образом.

Route::get('example', 'YourController@index')->middleware('auth');

Относительно вашего вопроса о ->with('decks', $decks): эта функция отправляетваша переменная $decks для представления, которое будет отображаться в шаблоне блейда.Эти данные используются сервером для визуализации страницы, а затем переменная отбрасывается.Если вы также хотите иметь возможность работать с этими данными на своей странице с помощью javascript, вы можете сделать что-то подобное в своем шаблоне блейда.

<script>
    var decks = {!!$decks->toJSON()!!};
</script>
0 голосов
/ 03 декабря 2018

Да!Вы можете вернуть разные результаты в зависимости от того, какой запрос был сделан.Нет необходимости в двух маршрутах:

public function index(Request $request)
{
    $decks = Auth::user()->decks->sortByDesc('name');

    if ($request->ajax()) {
        return response()->json(['decks' => $decks]);
    } else {
        return view('decks.index')->with('decks', $decks);
    }
}

@ Свен Хакворт прав, вы должны проверить аутентификацию в определении маршрута:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/decks', 'DecksController@index');
    // ... some other routes which requires authentication
}
0 голосов
/ 03 декабря 2018

Вы не можете получить $decks напрямую из индексного маршрута.Когда вы вызываете view(..)->with(...), он внутренне передается процессору шаблонов блейдов, который также получает переменную $decks, затем HTML создается на стороне сервера, а затем «скомпилированный» HTMl возвращается в браузер.Поэтому, когда сервер возвращает результат, переменная $decks больше не присутствует.Из-за этого поведения невозможно сделать то, что вы хотите.

Так что да, ваше решение - это путь, хотя вы могли бы рассмотреть завертывание Auth::check() в middleware и переместить вызов в$decks в отдельную функцию для упрощения вашего кода.

Я надеюсь, что это ответит на ваш вопрос, если что-то неясно, не стесняйтесь спрашивать!

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