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
}
我该怎么做?
答案 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();
}
如果您需要处理耗时较长(例如几分钟)的任务,并且不想让用户等待响应,则可以使用Queue和broadcast -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
收听事件。
这些队列和广播需要花费一些时间进行设置。明智地使用它。