как показать представление в контроллере с помощью Laravel - PullRequest
0 голосов
/ 06 апреля 2019

возможно ли в Laravel показывать представление в функции контроллера без остановки этой логики / процесса?

Что я имею в виду, когда я получаю доступ к этому конкретному маршруту (с помощью метода GET), пользовательотображается около 10 секунд с пустым белым экраном, в то время как перед перенаправлением в новое представление запускается достаточное количество логики.Как я могу показать представление во время работы этой логики?

ПРИМЕР:

protected function callback(Request $request)
{
  // - LOGIC DONE HERE WHICH CALLS ABOUT 3 SUBSEQUENT FUNCS, WHICH 
  // TAKES LONGER THAN USUSAL

  // - I WANT TO RETURN A VIEW HERE IN THE MEANTIME WHILE LOGIC RUNS 
  // WITHOUT HALTING THE PROCESS SO USER WONT BE SUBJECT TO JUST PLAIN 
  // WHITE SCREEN FOR EXTENDED PERIOD OF TIME
}

Как мне поступить?

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

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

Например, используя AJAX .

// HomeController
public function index() {
  return view('home');
}

// home.blade.php
function getMessage() {
  $.ajax({
    type:'POST',
    url:'/getmsg',
    data:'_token = {{ csrf_token() }}',
    success:function(data) {
        $("#msg").html(data.msg);
    }
  }); 
}
$(document).ready(function () {
  getMessage();
}

Если вам нужно обработатьзадача, которая занимает много времени (скажем, несколько минут), и вы не хотите, чтобы пользователь ждал ответа, вы можете использовать Очередь и широковещание для входа и возвратапредставление, чтобы попросить пользователя подождать первым.

// HomeController
public function index() {
  MailJob::dispatch();

  return view('home');
}

// MailJob
public function handle() {
  // job logic
  broadcast(new MailSent); // Notify front-end the event
}

Затем событие MailSent будет передано во внешний интерфейс.Затем вы слушаете событие, используя Laravel Echo в вашем интерфейсе.

Эти Очередь и Broadcast требуют довольно много времени для настройки, если вы не знакомы.Используйте это с умом.

1 голос
/ 06 апреля 2019

Это невозможно, из-за того, как работает сервер / клиент / запросы. Возможно, вы можете решить это следующим образом. Имейте только ОДНО представление с HTML-элементом загрузчика по умолчанию, что-то вроде вращающегося GIF. Затем вы помещаете что-то вроде этого JS для запуска, как только ваша страница загружается

fetch('/api/your-logic-process')
  .then((response) => response.json())
  .then(function(data) {
      //hide the loading element 
      //render the results
  })

Предполагается, что у вас есть маршрут API /api/your-logic-process, где вы можете справиться со своими трудоемкими задачами.

...