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

时间:2014-10-15 08:50:34

标签: 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_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设置属性该怎么办?我想我在这里缺少一些基本的东西。

提前感谢您的帮助!

1 个答案:

答案 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/