Объект Doctrine, полученный с помощью метода findOneBy, ведет себя как обычно, но вызывает фатальную ошибку

У меня есть приложение PHP с Doctrine 2 ORM. Я вызываю геттер для объекта сущности. Это работает, но PHP показывает фатальную ошибку, говорящую, что я вызываю метод с нулевым значением, но функция is_null, вызванная с тем же объектом, что и параметр (на одну строку выше ошибки), возвращает false. Самое странное, что вызов метода возвращает объект, и его поле печатается без проблем (см. вывод).

Я попытался получить другие объекты в том же месте, вызывая аналогичные методы и делая почти то же самое без ошибок. Есть проблема как раз с сущностями PageUrl.

Я думаю, что мои сопоставления в порядке и с самим кодом проблем нет. Я подозреваю, что встроенный веб-сервер Doctrine или PHP. Любые идеи, что вызывает ошибку и почему она не останавливает выполнение?

Ошибка

PHP Fatal error:  Uncaught Error: Call to a member function getPage() on null in .../Core/Routing/UrlResolver.php:39
Stack trace:
#0 .../Core/Routing/Router.php(92): Cms\Core\Routing\UrlResolver->getPageUrlForCurrentUrl()
#1 .../Core/Routing/Router.php(53): Cms\Core\Routing\Router->getPageUrl()
#2 .../Cms.php(21): Cms\Core\Routing\Router->process()
#3 ...index.php(12): Cms\Cms->run()
#4 ...built-in-server-routing.php(6): include('...')
#5 {main}
  thrown in .../Core/Routing/UrlResolver.php on line 39

Где происходит ошибка

/**
 * @return PageUrl|null
 */
public function getPageUrlForCurrentUrl(): ?PageUrl
{
    $relativeUrl = $this->currentUrl->getRelativeUrl();

    $url = $this->entityManager
        ->getRepository(PageUrl::class)
        ->findOneBy(['url' => $relativeUrl]);

    var_dump(is_null($url));
    var_dump($url->getPage()->getName()); // LINE 39 - FATAL ERROR

    return $url;
}

Выход

bool(false)
string(8) "Homepage"

Объект PageUrl

/**
 * @ORM\Table(name="page_url")
 * @ORM\Entity
 */
class PageUrl
{
    /**
     * @var string
     * @ORM\Id
     * @ORM\Column(type="string", length=200, nullable=false)
     */
    protected $url;

    /**
     * @var Page
     * @ORM\ManyToOne(targetEntity="Page", inversedBy="pageUrls")
     * @ORM\JoinColumn(name="page_id", referencedColumnName="id")
     */
    protected $page;

    /**
     * @return Page
     */
    public function getPage(): Page
    {
        return $this->page;
    }

    ...

}

Объект страницы

/**
 * @ORM\Entity
 */
class Page
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @var Collection
     * @ORM\OneToMany(targetEntity="PageUrl", mappedBy="page")
     */
    protected $pageUrls;

    ...

}

person jirig    schedule 28.02.2018    source источник
comment
Попробуйте очистить кэш доктрины и symfony. Изменить защищенный $url; напр. protected $urlTemp;, возможно, репозиторий сущностей сопоставлен с другим классом.   -  person Jannes Botis    schedule 01.03.2018
comment
Спасибо @JannesBotis, это помогло.   -  person jirig    schedule 02.03.2018


Ответы (1)


Очистка кеша Doctrine решила проблему для меня.

Решение Symfony https://stackoverflow.com/a/11826487/3972886

Решение доктрины https://stackoverflow.com/a/17485306/3972886

person jirig    schedule 28.02.2018