如何使用Laravel在控制器中显示视图

时间:2019-04-05 23:02:26

标签: php laravel controller laravel-blade

Laravel是否可以在Controller函数中显示视图而不停止该函数的逻辑/进程?

我的意思是,当我访问此特定路由(通过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 个答案:

答案 0 :(得分:1)

由于服务器/客户端/请求的工作方式,因此不可能。也许您可以这样解决。仅具有一个视图,带有默认的加载器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,可以在其中处理耗时的任务。

答案 1 :(得分:1)

一旦您回答空白页,然后是PHP request is dead。它必须涉及某种前端机制才能实现您想要的目标。

例如,使用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();
}

如果您需要处理耗时较长(例如几分钟)的任务,并且不想让用户等待响应,则可以使用Queuebroadcast -end并返回视图,请用户先等待。

// 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收听事件。

如果您不熟悉,

这些队列广播需要花费一些时间进行设置。明智地使用它。