[英]Symfony2 - notFoundExceptionError with my request
首先,抱歉我的英語...所以我想請求按類別顯示我的文章。 但每次我都會遇到自己的錯誤。 所以我的控制器是:
public function categorieAction($slug,$page)
{
if ($page < 1) {
throw new NotFoundHttpException('Page "'.$page.'" inexistante.');
}
$nbPerPage = 5;
$listArticles = $this->getDoctrine()
->getManager()
->getRepository('OAHNewsBundle:Article')
->getAvecCategories($slug, $page, $nbPerPage)
;
$nbPages = ceil(count($listArticles)/$nbPerPage);
if ($page > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
return $this->render('OAHNewsBundle:News:categorie.html.twig',array(
'listArticles' => $listArticles,
'nbPages' => $nbPages,
'page' => $page
));
}
我的存儲庫:
public function getAvecCategories ($page ,$slug, $nbPerPage )
{
$query = $this -> createQueryBuilder ('a')
->leftjoin ( 'a.categories' , 'c' )
->addselect('c')
->where('c.slug = :slug')
->setParameter('slug', $slug)
->leftjoin('a.image', 'i')
->addselect('i')
->orderBy('a.date', 'DESC')
->getQuery()
;
$query
->setFirstResult(($page-1) * $nbPerPage)
->setMaxResults($nbPerPage)
;
return new Paginator($query, true);
}
}
我的路線:
OAHNews_categorie:
path: /categorie/{slug}/{page}
defaults: { _controller: OAHNewsBundle:News:categorie , page: 1 }
requirements:
page: \d*
我得到的錯誤是:
if ($page > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
風景 :
{% extends "OAHNewsBundle::OAH_layout.html.twig" %}
{% block title %} {{ parent() }} - Index{% endblock %}
{% block body_news %}
{% for article in listArticles %}
<div class="article_des_news">
<div class="row">
<div class="col-sm-3">
<a href="{{path('OAHNews_voir', {'slugarticle':article.slugarticle})}}"><img src='{{ asset(article.image.webPath) }}' alt="{{ article.image.alt}}"/></a>
</div>
<div class="col-sm-9">
<a class="titre_article" href="{{path('OAHNews_voir', {'slugarticle':article.slugarticle})}}">{{article.titre}}
</a>
<p><i class="glyphicon glyphicon-pencil"></i> par {{article.auteur}},
<i class="glyphicon glyphicon-time"> </i> {{article.date|date('d/m/y')}}
{% if not article.categories.empty %}
<i class="glyphicon glyphicon-tag"> </i>
{% for categorie in article.categories %}
{{ categorie.nom }}{% if not loop.last %}, {% endif %}
{% endfor %}
{% endif %}
</p>
{{ article.contenu|truncate(100, false, "...")}}
</div>
</div>
</div>
{% endfor %}
<ul class="pagination pull-right">
{# On utilise la fonction range(a, b) qui crée un tableau de valeurs entre a et b #}
{% for p in range(1, nbPages) %}
<li{% if p == page %} class="active"{% endif %}>
<a href="{{ path('OAHNews_accueil', {'page': p}) }}">{{ p }}</a>
</li>
{% endfor %}
</ul>
{% endblock %}
和我使用的鏈接:
<ul class="nav nav-pills nav-stacked">
{% for categorie in listCategories %}
<li class='menu'>
<a class="titre_article normalLink" href="{{ path('OAHNews_categorie', {'slug': categorie.slug}) }}">
{{ categorie.nom }}
</a>
</li>
{% endfor %}
</ul>
那么我的請求有什么問題呢? 謝謝 !
好,我知道了 ! 您正在使用分頁器對象。 這個對象根本不給你結果。 如果你想得到articles
的數量,你必須這樣做:
$listArticles->count()
根據班級的文檔
但是請注意,因為您的“現有頁面檢查”存在一些邏輯問題:您的存儲庫最多只能返回 5 個結果,因此如果您嘗試訪問第二個頁面,您將得到類似的結果:
$nbPages = ceil($listArticles->count()/$nbPerPage); // [0 - 5] / 5 = 0 or 1
if ($page > $nbPages) { // if (2 > 0 or 1)
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
如果您想檢查您是否正在訪問現有頁面,您可以執行以下操作:
if ($listArticles->count() > 0) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
在您的回報中,您必須通過執行以下操作將結果數組發送到您的模板:
return $this->render('OAHNewsBundle:News:categorie.html.twig',array(
'listArticles' => $listArticles->getIterator(),
'nbPages' => $nbPages,
'page' => $page
));
問題 2:由於您的 repo 的這一行,您的偏移量錯誤等於 -5:
->setFirstResult(($page-1) * $nbPerPage) // $page = 0 so (0-1) * 5 = -5
這是因為您像這樣定義了getAvecCategories
:
getAvecCategories ($page ,$slug, $nbPerPage ) // page, slug, nbPerPage
你通過反轉參數來調用它:
->getAvecCategories($slug, $page, $nbPerPage) // slug, page, nbPerPage
所以 php 嘗試在 int 中投一個 slug 並返回 0。
路線應該是
OAHNews_categorie:
path: /categorie/{slug}/{page}
defaults: { _controller: OAHNewsBundle:News:categorie , page: 1 }
requirements:
page: \d+ <-- change \d* by \d+
嘗試在檢查之前強制轉換變量:
if (intval($page) > $nbPages) {
throw $this->createNotFoundException("La page ".$page." n'existe pas.");
}
否則, dump($page)
和dump($nbPages)
以了解您獲得的值並了解比較失敗的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.