【问题标题】:Can Laravel Controller functions return multiple views joined together?Laravel Controller 函数可以返回连接在一起的多个视图吗?
【发布时间】:2021-05-07 09:39:27
【问题描述】:

我正在使用 PHP Laravel 8.0 创建一个社交媒体网络应用程序。

就像 FB、Twitter 和 Instagram 一样,每当用户向下滚动到 'dashboard' 页面的底部时,应用程序的服务器都需要为用户提供更多帖子。

登录/注册后,服务器会在数据库中查询最近发布的 1000 个帖子(已排序),并将这 1000 个 ID 存储到会话变量 feed_post_ids 中。每次用户到达屏幕底部时,客户端都会发送一个 AJAX GET 请求,询问存储在会话变量中的接下来 5 个 id 中的每一个的完整记录数据。

现在服务器只是用 JSON 响应来响应客户端的 AJAX 请求。

但是,我希望服务器以 HTML 响应所有 5 个新帖子。

我无法返回这样的视图的原因: return view('dashboard', ['posts' -> $posts]); 是因为首先,页面不应该被刷新(这就是我使用 AJAX 的原因),其次,每个 $post 对象都需要包含 post.blade.php 的 HTML 部分(@include)。

PostController.php

public function fetchNextPosts(Request $request)
{
    $data = $request->all();

    $i = Session::get('feed_post_ids_pointer');
    $n = $data['n'];

    $ids = Session::get('feed_post_ids');

    $posts = [];

    for($x=$i; $x<$i+$n; $x++){
        $id = $ids[$x];
        $post = Post::find($id);
        array_push($posts, $post);            
    }

    $new_pointer = $i + $n;

    Session::put('feed_post_ids_pointer', $new_pointer);

    return json_encode($posts);
}

views\includes\post.blade.php

<div>
    <p>{{ $post->body }}</p>
    <span>{{ $post->created_at }}</span>
</div>

这是fetchNextPosts() 返回的 JSON 响应示例。

[{"id":596,"created_at":"2021-01-24T21:15:10.000000Z","updated_at":"2021-01-24T21:15:10.000000Z","body":"Iam id ipsum absurdum, maximum malum neglegi.","lang_id":7,"user_id":97},{"id":597,"created_at":"2021-01-24T21:15:10.000000Z","updated_at":"2021-01-24T21:15:10.000000Z","body":"Quid me istud rogas? Quae similitudo in genere etiam humano apparet.","lang_id":7,"user_id":97},{"id":598,"created_at":"2021-01-24T21:15:10.000000Z","updated_at":"2021-01-24T21:15:10.000000Z","body":"Moriatur, inquit.","lang_id":7,"user_id":97}]

我想包含这些数据的 HTML 可以通过返回一个带有 JSON 数据的 HTML 字符串从客户端生成。但我想要一个允许我使用刀片模板的解决方案,因为 post.blade.php 实际上大约有 100 行长,因此使用 JavaScript 渲染 HTML 会令人生畏。

【问题讨论】:

  • 看看刀片组件。也可以在调用 ajax 函数时返回一个视图。

标签: ajax laravel include laravel-blade


【解决方案1】:

我找到了解决方案。事实证明这比我想象的要容易得多。

使用 render() 函数,我能够将所有 5 个帖子的每个 includes\post.blade.php 结果的结果 HTML 连接起来。

服务器使用生成的 HTML 字符串响应 AJAX 请求。

使用 JavaScript,将返回的 HTML 字符串附加到 &lt;div id="posts"&gt;

PostController.php

public function fetchNextPosts(Request $request)
{
    $data = $request->all();

    $i = Session::get('feed_post_ids_pointer');
    $n = $data['n'];

    $ids = Session::get('feed_post_ids');

    $posts = [];

    for($x=$i; $x<$i+$n; $x++){
        $id = $ids[$x];
        $post = Post::find($id);
        array_push($posts, $post);            
    }

    $new_pointer = $i + $n;

    Session::put('feed_post_ids_pointer', $new_pointer);

    // added the following lines of code

    $html = "";

    foreach($posts as $post){
        $html .= view('includes.post', ['post' => $post])->render();
    }

    return $html;
}

dashboard.blade.php

    $.ajax({
        type: "GET",
        url: "/fetch-next-n-posts",
        data: {
            n: 5
        },
        success: function(response) {
            document.getElementById("posts").innerHTML += response;
        },
        error: function(response) {
            console.log(response);
        }
    });

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多