通过 findOneBy 方法获取的 Doctrine 实体的行为与往常一样,但会触发致命错误
Doctrine entity fetched via findOneBy method behaves like usual, but triggers a fatal error
我有一个使用 Doctrine 2 ORM 的 PHP 应用程序。我在实体对象上调用 getter。它有效,但 PHP 显示致命错误,说我在 null 上调用方法,但 is_null
函数使用与参数相同的对象调用(错误上方一行)returns false。最奇怪的部分是方法调用 returns 对象及其字段打印时没有问题(参见输出)。
我尝试在同一个地方获取其他实体调用类似的方法并做几乎相同的事情而没有错误。 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;
...
}
清除 Doctrine 缓存解决了我的问题。
Symfony 解决方案
学说解法
我有一个使用 Doctrine 2 ORM 的 PHP 应用程序。我在实体对象上调用 getter。它有效,但 PHP 显示致命错误,说我在 null 上调用方法,但 is_null
函数使用与参数相同的对象调用(错误上方一行)returns false。最奇怪的部分是方法调用 returns 对象及其字段打印时没有问题(参见输出)。
我尝试在同一个地方获取其他实体调用类似的方法并做几乎相同的事情而没有错误。 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;
...
}
清除 Doctrine 缓存解决了我的问题。
Symfony 解决方案
学说解法