【发布时间】: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