如果你看看你生成的代理類的一個,你會看到__load()
和__clone()
功能都扔EntityNotFoundException
。
__load()
函數在您「懶洋洋地」調用getName()
函數時調用。
class ObjectB extends \Foo\Entity\ObjectB implements \Doctrine\ORM\Proxy\Proxy
{
private $_entityPersister;
private $_identifier;
public $__isInitialized__ = false;
public function __construct($entityPersister, $identifier)
{
$this->_entityPersister = $entityPersister;
$this->_identifier = $identifier;
}
/** @private */
public function __load()
{
if (!$this->__isInitialized__ && $this->_entityPersister) {
$this->__isInitialized__ = true;
if (method_exists($this, "__wakeup")) {
// call this after __isInitialized__to avoid infinite recursion
// but before loading to emulate what ClassMetadata::newInstance()
// provides.
$this->__wakeup();
}
if ($this->_entityPersister->load($this->_identifier, $this) === null) {
throw new \Doctrine\ORM\EntityNotFoundException();
}
unset($this->_entityPersister, $this->_identifier);
}
}
...
public function getName()
{
$this->__load();
return parent::getName();
}
...
}
你基本上有兩個選擇,第一個是使用try/catch
塊。
try {
$name = $objectB->getName();
} catch (\Doctrine\ORM\EntityNotFoundException $e) {
$name = null;
}
或者,你可以看看在ObjectB
自己實現__wakeup()
功能,並可能處理這個(雖然你將很可能需要到反正拋出一個異常)。
最後,如果您感覺雄心勃勃,可以更改Proxy
模板。 \Doctrine\ORM\Proxy\ProxyFactory
包含模板。
/** Proxy class code template */
private static $_proxyClassTemplate =
'<?php
namespace <namespace>;
/**
* THIS CLASS WAS GENERATED BY THE DOCTRINE ORM. DO NOT EDIT THIS FILE.
*/
class <proxyClassName> extends \<className> implements \Doctrine\ORM\Proxy\Proxy
{
private $_entityPersister;
private $_identifier;
public $__isInitialized__ = false;
public function __construct($entityPersister, $identifier)
{
$this->_entityPersister = $entityPersister;
$this->_identifier = $identifier;
}
/** @private */
public function __load()
{
if (!$this->__isInitialized__ && $this->_entityPersister) {
$this->__isInitialized__ = true;
if (method_exists($this, "__wakeup")) {
// call this after __isInitialized__to avoid infinite recursion
// but before loading to emulate what ClassMetadata::newInstance()
// provides.
$this->__wakeup();
}
if ($this->_entityPersister->load($this->_identifier, $this) === null) {
throw new \Doctrine\ORM\EntityNotFoundException();
}
unset($this->_entityPersister, $this->_identifier);
}
}
你應該能夠只是在__load()
和__clone()
功能去除EntityNotFoundException
的投擲,雖然可能會有意想不到的副作用脫身。如果您計劃定期升級Doctrine,您也可能希望將此更改視爲修補程序。
如果你希望從一個getter對象並將其返回null,也許你應該測試空第一。這有點複雜,因爲Doctrine爲你創建代理對象,但原理是一樣的。 – hafichuk
這正是我的問題。你如何測試一個在數據庫中沒有物理記錄的代理對象? – Goran