扩展Doctrine Entity以添加业务逻辑

时间:2012-08-29 14:06:18

标签: php model-view-controller orm doctrine-orm

我正在努力练习一个好的设计并扩展Doctrine实体。 我的扩展类(基本上是模型)将具有额外的业务逻辑+访问实体基本数据。

我正在使用Doctrine 2.2.1& Zend Framework 1.11.4& php 5.3.8

当我使用DQL时,doctrine成功返回Model实体。 当我使用Doctrine native find()函数时,它什么都不返回:(。

... HELP

这是它如何滚动:

bootstrap.php中

    $classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH.'/doctrine');
    $classLoader->register();
    $classLoader = new \Doctrine\Common\ClassLoader('Models', APPLICATION_PATH);
    $classLoader->register();

APPLICATION_PATH \ models \ User.php中的模型

namespace Models;
use Doctrine\ORM\Query;

/**
 * Models\User
 *
 * @Table(name="user")
 * @Entity
 */
class User extends \Entities\User {

public function __wakeup() {
    $this->tools = new Application_App_Tools();
}

实体检索功能

不工作

$userEntity = $registry->entityManager->find('Models\User', $userEntity);

WORKS

$qry = $qb
        ->select('u')
        ->from('Models\User','u'); 

3 个答案:

答案 0 :(得分:4)

您不应该将业务逻辑添加到实体,而应该使用模型。一种方法是:

  1. 使用模型进行业务逻辑。
  2. 为您的所有数据库查询(DQL或其他)[1]创建自定义Doctrine 2存储库。
  3. 让您的实体独自一人。
  4. 实际上,这意味着模型是普通的PHP类(或者可能根据您使用的内容扩展框架),但您的模型与您的数据库无关。但是,您的模型会实例化您的自定义Doctrine 2存储库。例如。 UserRepository可能包含名为getUserById的方法。在您的存储库中,您可以运行实际查询并返回实体实例以供模型使用。

    [1] http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#custom-repositories

答案 1 :(得分:1)

据我了解Doctrine,entityManager仅对持久性实体负责,并且使用Entities\User扩展Model\User实体将创建另一个实体(存储在docblock中所述的相同表中),但是不是由entityManager管理或与其发生冲突,因为您可能未在@InheritanceType("SINGLE_TABLE") docblocks中提及Entities\User

阅读此文档了解更多信息http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

答案 2 :(得分:0)

我试图做的是一种不好的做法。 正如@IvanHušnjak提到的那样,我将我的数据库实体和工具与zend结合起来。

应该做的是解耦。

业务逻辑应该在服务\控制器中,这些应该解决实体及其方法。 你可以\应该将辅助函数添加到与实体属性相关的学说实体。

关于我的主要目的(要有一个Doctrine CLI可以重写和更新的实体类): doctrine只搜索本机字段\方法中的更改,相应地更新它们并丢弃所有其他函数(帮助程序)。所以当让doctrine更新php实体时没有问题!

P.S。 转到symfony2。