【问题标题】:how to show a view in controller using Laravel如何使用 Laravel 在控制器中显示视图
【发布时间】:2019-08-27 21:14:56
【问题描述】:

在 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
}

我该怎么做呢?

【问题讨论】:

    标签: php laravel controller laravel-blade


    【解决方案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 到前端并返回要求用户先等待的视图。

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

    如果您不熟悉这些 QueueBroadcast 需要相当长的时间来设置。明智地使用它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-17
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多