Doctrine2+;Symfony2:条令可以使用直接访问来映射属性吗?

Doctrine2+;Symfony2:条令可以使用直接访问来映射属性吗?,symfony,orm,doctrine-orm,Symfony,Orm,Doctrine Orm,我想将Doctrine2用于ORM。我有一个非常简单的类和一个XML元数据映射 一般的想法是,通过ORM和类的通信应该只通过get/set方法进行,而不向ORM公开类的内部(例如私有属性名称) <?php namespace Foo\Bar\Entity; class Test { private $name_property = null; public function setName($name) { $this->name_pro

我想将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;
    }

}
我认为Doctrine2总是使用get/set方法与对象进行交互,因为它试图直接访问属性

Doctrine真的可以映射类字段属性并始终尝试直接访问它们吗?如果my set()方法包含业务逻辑(例如字符串参数验证),那么直接通过Doctrine2设置属性就不是一个选项,该怎么办?我想我遗漏了一些基本的东西

提前感谢您的帮助

属性Foo\Bar\Entity\Test::$Name不存在

$name从未在测试类中声明。并且尝试从外部访问$name_属性是不可能的,因为它被声明为私有的。你也不需要它。出于这个原因,Set和Get方法就出现了

Doctrine真的可以映射类字段属性并始终尝试吗 直接访问它们?如果我的set()方法包含业务 逻辑

我认为这是一个明智的想法,把条令模型留给他们的制定者和获得者,正如你所发布的那样。 将您自己类中的业务逻辑排除在ORM之外。ORM的任务是成为代码和数据库之间的数据库抽象层,因此您可以使用OOP执行所有操作

在symfony文档中,对这一点进行了更好的描述: 在最佳实践手册第4章中,您可以阅读“组织您的业务逻辑”:

<?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>
Property Foo\Bar\Entity\Test::$Name does not exist