Symfony Запрос к базе данных возвращает Null

Allality

Новичок
Пробую подключиться к БД MySQL, но всегда получаю Null.

Контроллер:

PHP:
<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use AppBundle\Entity\Article;

class DefaultController extends Controller
{
    /**
     * @Route("/{articleUrl}", name="show", requirements={"articleUrl"=".*"})
     */

    public function indexAction(Request $request, $articleUrl)
    {
        $article = $this->getDoctrine()
        ->getRepository('AppBundle:Article') // Сущность src\AppBundle\Entity\Article.php
        ->find(1);

        $articleContent = $article->getContentHtml(); // геттер

        return $this->render('base.html.twig', array(
            'articleUrl' => $articleUrl
        ));
    }
}

Выдает ошибку:

Error: Call to a member function getContentHtml() on null

dump ($article) выдает:

in DefaultController.php line 26:
null


Подскажите, в чем здесь проблема?
 

hell0w0rd

Продвинутый новичок
Интересно, ты ищешь по id статью. Что же может значить, что по определенному id тебе возвращается null?
 

Allality

Новичок
Интересно, ты ищешь по id статью. Что же может значить, что по определенному id тебе возвращается null?
Это для примера. Но и это не работает, по идее ведь должен возвращаться объект с содержимым строки с id = 1 из базы.
 

AmdY

Пью пиво
Команда форума
Интересно, ты ищешь по id статью. Что же может значить, что по определенному id тебе возвращается null?
думаешь стоит воспользоваться полноценной БД вроде postgresql или mongodb? или винду переставить? может тему в корзину?
 

keltanas

marty cats
@Allality, Хорошим правилом будет проверять, действительно ли в базе было что-то найдено и возвращать соответстующий код ошибки, если нет
PHP:
if (!$entity) {
  throw $this->createNotFoundException();
}
А если уже пользуешься аннотациями, то можено сразу применить ParamConverter он сам вернет 404.http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
 

Allality

Новичок
>>The return value is either the found entity instance or null if no instance could be found with the given identifier.
Спасибо, find() с правильным id работает.

На деле же хочу использовать методы вроде findOneByUrl(), например, где url - это столбик в MySQL таблице.

findOneByUrl('$articleUrl') возвращает null, хотя значение $articleUrl в этот момент правильное. Я делаю что-то не так?
 

hell0w0rd

Продвинутый новичок
думаешь стоит воспользоваться полноценной БД вроде postgresql или mongodb? или винду переставить? может тему в корзину?
нет. Хочу сказать, что вы за ТС погуглили документацию.
А он был уже на правильном пути:
Это для примера. Но и это не работает, по идее ведь должен возвращаться объект с содержимым строки с id = 1 из базы.
 

stalxed

Новичок
@Allality, смотри запрос, который генерирует доктрина. Это видно в дебаг панели symfony.
В дебаг панели кликаешь на рисунок с базой данных, ищешь свой запрос, кликаешь по [Display runnable query]. Выполняешь запрос ручками к БД.
Дальше уже становится ясно куда копать...

Кстати, ещё рекомендую это http://www.zend.com/en/products/server/z-ray
Для develop окружения потрясная штука, с ней подобные баги ищутся в секунды(т.е. внизу будет 2 панели: symfony и zray).
 

Allality

Новичок
@Allality, смотри запрос, который генерирует доктрина. Это видно в дебаг панели symfony.
В дебаг панели кликаешь на рисунок с базой данных, ищешь свой запрос, кликаешь по [Display runnable query]. Выполняешь запрос ручками к БД.
Дальше уже становится ясно куда копать...
Спасибо большое. Все понял, все работает. Странно, почему в оф. книге не делают акцент на панель для дебага.

Кстати, ещё рекомендую это http://www.zend.com/en/products/server/z-ray
Для develop окружения потрясная штука, с ней подобные баги ищутся в секунды(т.е. внизу будет 2 панели: symfony и zray).
Я пока основы изучаю. Дорасту, попробую. Спасибо. )
 

Allality

Новичок
нет. Хочу сказать, что вы за ТС погуглили документацию.
А он был уже на правильном пути:
Проблема в том, что любой новичок порой натыкается на грабли, которые сам не может победить, хотя другой новичок их пройдет и даже не заметит. Я пару лет назад делал проект на S2 и тогда также споткнулся о доктриновские findы, тогда плюнул и сделал через доктриновский конструктор запросов.

Сейчас тоже споткнулся, но решил добить. Мне казалось, что проблема не в моем коде, а в моем непонимании синтаксиса. И не факт, что без посторонней помощи я бы решил проблему. Для этого и существует форум.
 

AmdY

Пью пиво
Команда форума
Для этого существует оффициальная документация, поиск и только когда убедился что твой кейс не описан люди начинают задавать вопросы другим людям.
 

Allality

Новичок
Для этого существует оффициальная документация, поиск и только когда убедился что твой кейс не описан люди начинают задавать вопросы другим людям.
Конкретно с этой проблемой я перерыл всю документацию. Смотрел также другие фреймворки (Laravel), искал официальную документацию доктрины, искал на StackOverflow. Честно говоря, голову сломал, потому что в большинстве случаев натыкался на устаревшие примеры доктрины. Вы ребята судите по себе, давно забыв как учились и вникали во все вы сами.

Из ваших слов я понял, что это все просто и описано в документации, но я "посмотрев в книгу увидел фигу". Также понимаю, что проблема плевая, это я сейчас понимаю. Какой выход у новичка случае, когда он спотыкается на камень и не может его обойти? Забить на фреймворк/технологию и сделать по-другому или попросить помощи.
 

AmdY

Пью пиво
Команда форума
Я сужу по себе, потому что так же не знал ответа на данный вопрос и введя в поисковик "doctrine find return null" за минуту нашёл ответ, включая исходники на гитхабе. То что у нас есть опыт, не говорит о том, что мы знаем всё и не учимся как новички.
 
Сверху