我创建了一个类来更新购物车对象。当我尝试更新已经存储在数据库中的对象时,出现错误The class "Doctrine\ODM\MongoDB\PersistentCollection" was not found in the chain configured namespaces App\Document"
。此错误仅与购物车对象有关(并且仅在对象更新期间发生。创建新对象不会出现问题),尽管项目中存在类似的对象也不会引起此类问题。
除了此错误外,我还发现了一些其他信息:
Class 'Cart' does not exist
购物车班级:
namespace App\Document;
use DateTime;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\EmbeddedDocument()
*/
class CartItem
{
/**
* @MongoDB\Field(type="string")
*/
private $productId;
/**
* @MongoDB\Field(type="integer")
*/
private $quantity;
// More fields ...
/**
* @return string
*/
public function getProductId(): string
{
return $this->productId;
}
/**
* @param string $productId
* @return CartItem
*/
public function setProductId($productId): CartItem
{
$this->productId = $productId;
return $this;
}
/**
* @return int
*/
public function getQuantity(): int
{
return $this->quantity;
}
/**
* @param int $quantity
* @return CartItem
*/
public function setQuantity(int $quantity): CartItem
{
$this->quantity = $quantity;
return $this;
}
// More getters and setters ...
}
/**
* @MongoDB\Document()
*/
class Cart
{
/**
* @MongoDB\Id
*/
private $id;
/**
* @MongoDB\Field(type="string")
*/
private $hash;
/**
* @MongoDB\Field(type="date")
*/
private $date;
// More fields ...
/**
* 'Bad' field
* @MongoDB\EmbedMany(targetDocument="CartItem")
*/
private $products;
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getHash(): ?string
{
return $this->hash;
}
/**
* @param string $hash
* @return Cart
*/
public function setHash(string $hash): Cart
{
$this->hash = $hash;
return $this;
}
/**
* @return DateTime
*/
public function getDate(): DateTime
{
return $this->date;
}
/**
* @param DateTime $date
* @return Cart
*/
public function setDate(DateTime $date): Cart
{
$this->date = $date;
return $this;
}
// More getters and setters
/**
* @return CartItem[]|null
*/
public function getProducts()
{
return $this->products;
}
/**
* @param CartItem[] $products
* @return Cart
*/
public function setProducts(array $products): Cart
{
$this->products = $products;
return $this;
}
}
用于更新购物车对象的类只是一组业务逻辑(检查后,事实证明它不会以任何方式影响错误,因此我没有显示该逻辑)和使用以下方法保存标准对象:
$cart = $this->documentManager->getRepository(Cart::class)->find('some_id');
$cart->setProducts([/* CartItem[] */]);
$this->documentManager->flush();
我还附加了配置文件(config/packages/doctrine.yaml
):
doctrine_mongodb:
auto_generate_proxy_classes: true
auto_generate_hydrator_classes: true
connections:
default:
server: '%env(resolve:MONGODB_URL)%'
options: {}
default_database: '%env(resolve:MONGODB_DB)%'
document_managers:
default:
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Document'
prefix: 'App\Document'
alias: App
可能是什么问题?
答案 0 :(得分:0)
再次在逻辑的每个阶段检查返回的变量类型。从数据库检索时,$cart->getProducts()
某种程度上属于类型[object] (Doctrine\\ODM\\MongoDB\\PersistentCollection: {})
,因此在更新购物车对象时找不到该类会发生错误。我还查看了Doctrine\Common\Collections\Collection
接口documentation,发现有一个toArray()
方法可以很好地将PersistentCollection
转换为[ CartItem[] ]
。