您可以有一个实体管理器来管理特定实体类型的创建、加载、更新等。
例如,对于 FOSUserBundle,您可能希望使用UserManager来创建用户实体,而不是使用旧方法。
// Good
$user = $container->get('fos_user.user_manager')->createUser();
// Not so good
$user = new User();
这样,您可以将管理委派给另一个类(在本例中为UserManager)并添加额外的控件。
所以假设你有一个实体Foo
。您必须创建一个在创建和加载时FooManager
自动绑定Imagine
的服务。Foo
实体 :
<?php
namespace Acme\DemoBundle\Entity;
class Foo
{
protected $id;
protected $imagine;
public function getId()
{
return $this->id;
}
public function setImagine($imagine)
{
$this->imagine = $imagine;
return $this;
}
public function getImagine()
{
return $this->imagine;
}
public function getBrowserPath()
{
return $this->imagine->getBrowserPath($this->getWebPath(), 'my_thumb')
}
public function getWebPath()
{
return 'the_path';
}
}
经理 :
<?php
namespace Acme\DemoBundle\Manager;
class FooManager
{
// Service 'imagine.cache.path.resolver' injected by DIC
protected $imagine;
// Entity repository injected by DIC
protected $repository;
public function __construct($imagine, $repository)
{
$this->imagine = $imagine;
$this->repository = $repository;
}
public function find($id)
{
// Load entity from database
$foo = $this->repository->find($id);
// Set the Imagine service so we can use it inside entities
$foo->setImagine($this->imagine);
return $foo;
}
}
然后你会使用类似的东西$foo = $container->get('foo_manager')->find($id);
。
当然,您将不得不稍微调整一下这个类。
不确定这是否是最好的方法,但这是我发现的唯一解决方法,因为我们无法将服务注入实体。