我想将Doctrine2用于ORM。我有一个非常简单的类和XML元数据映射。
一般的想法是,通过ORM和类进行的通信应仅通过get / set方法进行,而不会将类的内部(例如私有属性名称)暴露给orm。
<?php
namespace Foo\Bar\Entity;
class Test {
private $name_property = null;
public function setName($name)
{
$this->name_property = $name;
}
public function getName()
{
return $this->name_property;
}
}
和映射
<?xml version="1.0" encoding="UTF-8" ?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Foo\Bar\Entity\Test">
<field name="Name" type="text" />
</entity>
我认为这个设置应该在从/向数据库取消/序列化对象时调用方法getName()和setName($ string_argument)。
显然它没有。
Property Foo\Bar\Entity\Test::$Name does not exist
我认为Doctrine2总是使用get / set方法与对象进行交互,因为它会尝试直接访问属性。
Doctrine是否真的只是映射类字段属性并始终尝试直接访问它们?如果我的set()方法包含业务逻辑(例如字符串参数验证),那么如果直接通过Doctrine2设置属性该怎么办?我想我在这里缺少一些基本的东西。
提前感谢您的帮助!
答案 0 :(得分:1)
属性Foo \ Bar \ Entity \ Test :: $ Name不存在
$ name永远不会在Test类中声明。并且尝试从外部访问$ name_property是不可能的,因为它被声明为私有。你也不需要它。出于这个原因,那里有Set和Get方法。
Doctrtrine真的可以映射类字段属性并始终尝试 直接访问它们?如果我的set()方法包含业务怎么办? 逻辑
我认为将Doctrine Models与他们的发布者和getter一起留下是一个明智的想法。 将业务逻辑保留在ORM中。 ORM的任务是成为代码和数据库之间的数据库抽象层,因此您可以使用OOP完成所有操作。
在symfony文档中,这更好地描述了: http://symfony.com/doc/current/book/doctrine.html 在最佳实践手册第4章中,您可以阅读“组织业务逻辑”: http://symfony.com/doc/download-best-practices-book/