如何使用抽象类

时间:2016-08-03 17:16:59

标签: mongodb symfony doctrine-orm

我有一个像

这样的抽象类
class Importer
{
    public static function getInstance($url)
    {

    }

    protected function saveUser(User $user)
    {
        //here I want to use doctrine to save persist my User Entity
    }           
} 

和另一个扩展那个

的类
class XmlImporter extends Importer()
{
    public function processUser()
    {
         //do something with my data
         parent::processUser($user);
    }
}

非常标准的情况。问题在于saveUser我需要将我的用户保存在db上(我正在使用mongo),那么,我该如何获得实体管理器?我觉得我可以使用服务,但我不知道在儿童班或父母那里收到服务的地方?我可以遵循的任何其他最佳做法。

谢谢

1 个答案:

答案 0 :(得分:0)

如果你需要在你的实体中获得实体经理,这是非常糟糕的架构。实体是关联数组之类的对象。它需要做的就是控制内部属性。实体可以在不同的经理中使用。

如果您要创建另一个服务层来控制实体,那将会更好。

例如:

class User 
{

    /* @ORM ... */
    private $id
    /* @ORM ... */
    private $name

    public function getId() {...}
    public function setName($name) {...}
    public function getName() {...}

    public function __toString()
    {
        return sprintf(
            'User [id: %s, name: "%s"',
            $this->getId() ? $this->getId() : '-',
            $this->getName()
        )
    }

}

class UserModel
{

    /** @var ContainerInterface */
    protected $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    protected function getEntityManager()
    {
        $em = $this->container->get('doctrine')->getManagerForClass('AppBundle:User');
        /** @var EntityManager $em */
        return $em;
    }

    protected function validatePersistFlush(User $user)
    {
        // validate
        $errors = $this->container->get('validator')->validate($user);
        if (count($errors)) {
            throw new \Exception(sprintf(
                '%s is not valid: %s',
                $user,
                (string)$errors
            ));
        }

        // persist
        $this->getEntityManager()->persist($user);

        // flush
        $this->getEntityManager()->flush($user);

    }

    public function create($name)
    {
        $user = new User();
        $user->setName($name);
        $this->validatePersistFlush($user)
        return $user;
    }

    public rename(User $user, $newName)
    {
        $user->setName($newName);
        $this->validatePersistFlush($user)
        return $user;        
    }

}