我有一个像
这样的抽象类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),那么,我该如何获得实体管理器?我觉得我可以使用服务,但我不知道在儿童班或父母那里收到服务的地方?我可以遵循的任何其他最佳做法。
谢谢
答案 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;
}
}