Symfony2 - notFoundExceptionError с моим запросом

1

Во-первых, извините за мой английский... Поэтому я хочу сделать запрос, чтобы показать свою статью по категориям. Но каждый раз, когда я просто получаю свою собственную ошибку. Итак, мой контроллер:

 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>

Так что же не так с моей просьбой? Спасибо !

  • 0
    Можете ли вы показать, как вы называете свою страницу?
  • 0
    Я отредактировал свой пост
Показать ещё 5 комментариев
Теги:

2 ответа

1
Лучший ответ

Ладно, я понял ! Вы используете объект Paginator. Этот объект не дает вам результатов вообще. Если вы хотите получить количество 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. У вас есть ошибка смещения, равная -5 из-за этой строки вашего репо:

->setFirstResult(($page-1) * $nbPerPage) // $page = 0 so (0-1) * 5 = -5

И это потому, что вы определили, что вы getAvecCategories такие же getAvecCategories:

getAvecCategories ($page ,$slug, $nbPerPage ) // page, slug, nbPerPage

И вы вызываете его, инвертируя аргументы:

 ->getAvecCategories($slug, $page, $nbPerPage) // slug, page, nbPerPage

Поэтому php попытается запустить slug в int и вернуть 0.

  • 0
    Ваш метод отправляет мне следующую ошибку: LIMIT аргумент offset = -5 недопустим. И я не понимаю, почему мой аргумент здесь отрицательный ...
  • 0
    Да, это доказывает, что это работает лучше. Я отредактировал свой ответ со второй проблемой
Показать ещё 2 комментария
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.");
  }

Else, dump($page) и dump($nbPages) чтобы узнать, какое значение вы получите, и понять, почему сбой не удалось.

  • 0
    У меня все та же ошибка с \ d +, и, видимо, int () не работает в моем хранилище
  • 0
    Вы должны очистить кеш, если вы не находитесь в режиме отладки. Извините, это была intval() . Я обновил ответ.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню