tet*_*anz 19 symfony doctrine-orm
我对Symfony 2中的最佳实践有疑问.抱歉,如果它有点模糊和主观.我想我可以总结一下我的问题:
"存储库总是适合查询的地方吗?"
现在我把我的大多数学说查询放在实体存储库中.我的大多数控制器操作都执行典型的操作,例如查询实体或实体集合,抛出异常或重定向,具体取决于结果,否则更新一个或多个实体.大多数操作比标准 - > find, - > findBy等查询更有效.大多数都需要加入.当一个查询涉及多个实体时,有时我不确定它应该进入哪个存储库.我猜有查询的根实体但是......有时来自连接实体的数据更重要且更相关所以感觉不对将它放在根实体的存储库中.
这工作正常但我倾向于在我的存储库中得到很多几乎相同但略有不同的查询.提出名字并准确跟踪每个人所做的事情会让人感到困惑和乏味.大多数这些查询仅由同一控制器中的一个或两个(通常很少使用)控制器操作使用.我觉得我用太多专门的,很少使用的东西使我的存储库变得混乱.
看起来除了最简单的操作之外的所有操作都应该封装在对象或服务中.所以,我已经开始直接在服务中而不是存储库中执行大量查询.在一个地方很容易看到动作.这是一个好的做法吗?
Nic*_*ich 10
您的查询应保存在您的实体存储库中,而不是保存在控制器中,以便能够轻松地重复使用它们.
这就是存储库实际上是什么.为数据库查询提供可重用的位置.
但是在某些情况下,可以改进存储库中的所有查询...尤其是在过滤时可能需要很多查询的情况.
Benjamin Eberlei(Doctrine的创建者)认为一个类中的5个公共方法是可以的,10个是相当大的.他最近在他的博客上发表了一篇有趣的文章,名为" 在教条中驯服存储库 ".
我部分地喜欢KnpLabs在他们的DoctrineBehaviors中的可过滤的存储库特性解决方案.
特性使测试更加困难,但您可以拥有更清洁,更易于维护的存储库 ...... 您应该在哪里保持查询.
你可以在中间做点什么.
定义服务:
blog.post_manager:
class: Acme\BlogBundle\Entity\Manager\PostManager
arguments:
em: "@doctrine.orm.entity_manager"
class: Acme\BlogBundle\Entity\Post
Run Code Online (Sandbox Code Playgroud)
然后创建Manager类:
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
class PostManager
{
protected $em;
protected $repo;
protected $class;
public function __construct(EntityManager $em, $class) {
$this->em = $em;
$this->class = $class;
$this->repo = $em->getRepository($class);
}
public function get($id)
{
return $this->repo->findById($id);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您仍然可以将查询保留在存储库中,同时允许通过管理器服务重用代码,这可以在任何控制器中使用:
$this->container->get('blog.post_manager')->get(1);
Run Code Online (Sandbox Code Playgroud)
由于服务负责将类和实体管理器注入到Manager类中,这也使控制器更薄并且更好地将其从模型中抽象出来.
| 归档时间: |
|
| 查看次数: |
9685 次 |
| 最近记录: |