Extending Doctrine Entity in order to add business

2019-04-06 16:01发布

I'm trying to practice a good design and extending Doctrine entity. My extended class, the model basically, will have extra business logic + access to the entity basic data.

I am using Doctrine 2.2.1 & Zend Framework 1.11.4 & php 5.3.8

When I use DQL, doctrine return successfully the Model entity. When I use Doctrine native find() function, it returns nothing :(.

HELP...

This is how it rolls:

Bootstrap.php:

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

Model in 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();
}

Entity retrieval functions:

DOESN'T WORK:

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

WORKS:

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

3条回答
不美不萌又怎样
2楼-- · 2019-04-06 16:13

What I tried to do was a bad practice. I coupled my DB entity and tools from zend as @Ivan Hušnjak mentioned.

What should be done is de-coupling.

Business logic should be in services\controller and these should address the entity and it's methods. you can\should add helper functions to the doctrine entity that only relates to the entity properties.

Regarding my main purpose (to have an entity class that the Doctrine CLI can rewrite & update): doctrine only searches from changes in the native fields\methods, updates them accordingly and discard all other functions (helpers). so there is no problem when letting doctrine update the php entity!

p.s. move to symfony2.

查看更多
Juvenile、少年°
3楼-- · 2019-04-06 16:16

You shouldn't add the business logic to the entities, you should use models for that instead. One way of doing it would be:

  1. Use models for business logic.
  2. Create custom Doctrine 2 repositories for your all your database queries (DQL or otherwise) [1].
  3. Leave your entities alone.

In practise this means that models are plain PHP classes (or maybe framework extended depending on what your're using) but your models have no relation to your database. Your models do however, instantiate your custom Doctrine 2 repositories. E.g. a UserRepository might contain a method called getUserById. Within your repositories is where your run your actual queries and return entity instances for the models to work with.

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

查看更多
再贱就再见
4楼-- · 2019-04-06 16:37

As I understand Doctrine, entityManager is responsible only for persistent entities, and extending Entities\User entity with Model\User will create another entity (stored in same table as stated in docblock), but not managed by entityManager or in collision with it because you probably didn't mention @InheritanceType("SINGLE_TABLE") in Entities\User docblocks:

Read this docs for more info http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

查看更多
登录 后发表回答