通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误相关的知识,希望对你有一定的参考价值。

我有一个带有Doctrine 2 ORM的php应用程序。我在实体对象上调用getter。它工作,但PHP显示致命错误说我在null上调用方法,但is_null函数调用与参数相同的对象(错误上方一行)返回false。最奇怪的部分是方法调用返回一个对象,其字段打印没有问题(参见输出)。

我尝试在同一个地方取出其他实体,调用类似的方法并做几乎相同的东西而没有错误。 PageUrl实体存在问题。

我认为我的映射是可以的,代码本身没有问题。我怀疑是Doctrine或PHP内置的webserver。是什么原因导致错误,为什么不停止执行?

错误

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): CmsCoreRoutingUrlResolver->getPageUrlForCurrentUrl()
#1 .../Core/Routing/Router.php(53): CmsCoreRoutingRouter->getPageUrl()
#2 .../Cms.php(21): CmsCoreRoutingRouter->process()
#3 ...index.php(12): CmsCms->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

/**
 * @ORMTable(name="page_url")
 * @ORMEntity
 */
class PageUrl
{
    /**
     * @var string
     * @ORMId
     * @ORMColumn(type="string", length=200, nullable=false)
     */
    protected $url;

    /**
     * @var Page
     * @ORMManyToOne(targetEntity="Page", inversedBy="pageUrls")
     * @ORMJoinColumn(name="page_id", referencedColumnName="id")
     */
    protected $page;

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

    ...

}

页面实体

/**
 * @ORMEntity
 */
class Page
{
    /**
     * @var int
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    protected $id;

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

    ...

}
答案

清除Doctrine缓存为我解决了这个问题。

Symfony解决方案https://stackoverflow.com/a/11826487/3972886

学说解决方案https://stackoverflow.com/a/17485306/3972886

以上是关于通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine ORM 2 选择负数

教义关系是否会影响应用程序性能?

教义 findOneBy 方法不起作用

方法名称必须以 findBy 或 findOneBy 开头。未定义的方法 Symfony?

Symfony2 - 方法名称必须以findBy或findOneBy开头

如何使用symfony获取Doctrine实体持久集合数据值