Hal*_*nex 1 php jquery laravel laravel-5 laravel-5.1
我有一个带有per_page输入字段的评论列表,允许用户通过 ajax 在页面上显示更多评论。默认情况下,它设置为50
但是当我尝试更改它时,比如 25,我在开发人员的控制台中收到此错误
POST http://localhost/r2/public/posts/per_page 500(内部服务器错误)
在Network选项卡中,我可以看到此错误
LengthAwarePaginator.php 第 48 行中的 ErrorException:
被零除
在 LengthAwarePaginator.php 第 48 行
在 HandleExceptions->handleError('2', 'Division by zero', 'C:\xampp\htdocs\r2\vendor\laravel\framework\src\Illuminate\Pagination\LengthAwarePaginator.php', '48', array(' items' => array(), 'total' => '0', 'perPage' => null, 'currentPage' => '1', 'options' => array('path' => ' http:// localhost/r2/public/posts/per_page ', 'query' => array()), 'key' => 'query', 'value' => array())) 在 LengthAwarePaginator.php 第 48 行
在 LengthAwarePaginator->__construct(array(), '0', null, '1', array('path' => ' http://localhost/r2/public/posts/per_page ', 'query' => array( ))) 在 CommentController.php 第 51 行
在 CommentController->paginate(array(), null, object(Request), object(Post)) 在 CommentController.php 第 57 行
在 CommentController->comment_list(null, object(Request), object(Post)) 在 CommentController.php 第 153 行
在 CommentController->show_comment_list(object(Request), object(Post)) 在 CommentController.php 第 164 行
在 CommentController->per_page(object(Request), object(Post), 'posts')
在我更改其路线以将其与帖子页面集成之前,它运行良好。
我的路线
Route::get('{post}/comment', ['as' => 'comment', 'uses' => 'CommentController@index']);
Route::post('{post}/post_this_comment', 'CommentController@post_this_comment');
Route::get('{post}/recaptcha', 'CommentController@recaptcha');
Route::get('{post}/reply_comment', 'CommentController@reply_comment');
// this is the per_page route
Route::post('{post}/per_page', ['as' => 'per_page', 'uses' => 'CommentController@per_page']);
Route::post('{post}/comment/update', ['as' => 'comment/update', 'uses' => 'CommentController@update']);
Run Code Online (Sandbox Code Playgroud)
这是 CommentController
private function paginate($items, $perPage, Request $request) {
$page = Input::get('page', 1); // get current page or default to 1
$offset = ($page * $perPage) - $perPage;
return new LengthAwarePaginator(
array_slice($items, $offset, $perPage, false),
count($items),
$perPage,
$page,
['path' => $request->url(), 'query' => $request->query()]);
}
protected function comment_list($per_page, Request $request, Post $post) {
$root_comments = Comment::root_comments($post->id);
$root_with_replies = $this->include_replies_for($root_comments);
$paginated_comments = $this->paginate($root_with_replies, $per_page, $request, $post);
return $paginated_comments;
}
protected function show_comment_list(Request $request, Post $post) {
$per_page = Input::get('per_page');
session(['per_page' => $per_page]);
$comment_list = view('eastgate.comment.comment_list')
->with('comments', $this->comment_list($per_page, $request, $post))
->with('total_comments', $this->total_comments())
->with('per_page', $per_page)
->render();
return $comment_list;
}
public function per_page(Request $request, Post $post){
$response = array(
'status' => 'success',
'msg' => 'reply comment',
'comment_list' => $this->show_comment_list($request, $post)
);
return Response::json($response);
}
Run Code Online (Sandbox Code Playgroud)
这是 JS 和 HTML
$(document).on('change', 'input.comments_per_page', function(){
var formData = new FormData();
formData.append('per_page', $('.comments_per_page').val());
var request = $.ajax({ // push question data to server
type : 'POST', // define the type of HTTP verb we want to use (POST for our form)
url : 'per_page', // the url where we want to POST
data : formData,
dataType : 'json',
processData : false,
contentType : false
});
request.done(per_page_done_handler);
request.fail(per_page_fail_handler); // fail promise callback
});
<div class="col-xs-12">
Show <input type="text" name="comments_per_page" class="comments_per_page" value="{!! $per_page !!}" size="2" title="Number of comments per page"> comments per page
</div>
Run Code Online (Sandbox Code Playgroud)
更新
我应该提一下,我还可以看到laravel的默认分页div,当我单击具有页面urlhttp://localhost/r2/public/posts/2/?page=2重定向到的第二页时,出现http://localhost/posts/2?page=2此错误
错误 404 未找到对象!
但是如果我手动去这个网址 http://localhost/r2/public/posts/2?page=2
带有评论的第二页加载得很好。
更新 2
我只是setPath对$paginated_comments在comment_list()法,现在下一个页面被打开罚款。但是Division by zero当我尝试更改显示的评论数量时仍然出现错误。
$paginated_comments = $this->paginate($root_with_replies, $per_page, $request, $post);
$paginated_comments->setPath('');
Run Code Online (Sandbox Code Playgroud)
per_page 编号(50 或 25)无关紧要。如果你看\vendor\laravel\framework\src\Illuminate\Pagination\LengthAwarePaginator.php,你可以看到你的问题行(它抛出异常Division by zero):
$this->lastPage = (int) ceil($total / $perPage); // <= problem
Run Code Online (Sandbox Code Playgroud)
这意味着只有一件事 -$perPage是 0 或 null => 您没有将per_page(25) 的预期值传递给 LengthAwarePaginator 构造函数。您需要per_page按方法检查 var语句per_page()=> show_comment_list() => comment_list()=> paginate()。
PS恕我直言,它应该是分页的一个单一动作。您拥有制作它所需的所有信息,但是,您将其分为四个“部分”。
| 归档时间: |
|
| 查看次数: |
2916 次 |
| 最近记录: |