gpt4 book ai didi

model-view-controller - 模型中的 Symfony2 entityManager

转载 作者:行者123 更新时间:2023-12-04 01:40:30 25 4
gpt4 key购买 nike

我将在我的模型中使用 entity_manager。但 entity_manager 仅在 Controller 中可用:throw $em = $this->get('doctrine.orm.entity_manager') .所以,我必须用 $em 定义模型方法。范围。这使得 phpUnit 测试变得非常困难并且违反了应用程序结构。例如:

class Settings
{
public static function getParam( $em, $key )
{
$em->createQuery("
SELECT s
FROM FrontendBundle:Settings s
WHERE s.param = {$key}
");
return $em->getResult();
}
}

有什么方法可以在模型部分使用 entity_manager 服务吗?

最佳答案

首先,开始注意:按照惯例,您的 Entity 类可能应该是单数的。所以,设置,而不是设置。您可能会争辩说,作为一组相关设置的“设置”可以被视为一个实体。不过,要记住一些事情。

在 Doctrine2 中,您将使用存储库来进行此类查询。在您要调用 Settings::getParam 的代码中,您将改为获取存储库并进行查询。在 symfony2 中,说:

// $em is your entitymanager, as you were going to pass to your method above
// $key is the key you were going to pass to your method above
$repository = $em->getRepository('\FrontendBundle\Settings');
$setting = $repository->getByParam($key);

默认情况下,无需编写任何代码,存储库就会为实体中的每个字段定义 getByXXXX。

如果要进行更复杂的查询,可以扩展存储库。
use Doctrine\ORM\EntityRepository;

class SettingsRepository extends EntityRepository
{
public function getBySomeComplicatedQuery() {
$sort_order = $this->getEntityManager()
->createQuery('SELECT count(s) FROM FrontendBundle\Settings s WHERE s.value > 32')
->getResult(Query::HYDRATE_SINGLE_SCALAR);
}

}

然后你会以同样的方式调用那个方法。

其他人会提倡使用 Manager 对象,然后该对象不会与实体/ORM 绑定(bind),但我认为在这种情况下这是不必要的复杂化。

Doctrine2 专门设计为不允许您在实体文件中使用查询; Entities 和 EntityManagers 实际上是标准模型层的两个方面,分开以执行最佳实践。见这篇文章: http://symfony2basics.jkw.co.nz/get-symfony2-working/entities/

关于model-view-controller - 模型中的 Symfony2 entityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com