Symfony 是否有任何方法可以使用自定义选择器(查找方法)选择用户?
我使用的是Symfony 是否有任何方法可以使用自定义选择器(查找方法)选择用户?,symfony,doctrine-orm,fosuserbundle,Symfony,Doctrine Orm,Fosuserbundle,我使用的是FriendsOfSymfony/FOSUserBundle(原则)。所有的工作都很好,除了我想用我的自定义选择器(查找方法)选择用户,因为我想制作一些关节 有没有比改变捆绑代码更好的方法 更新: 我知道可以使用customfindOneBy…(来自我自己的repository类),但我认为这种方法是不正确的:当你看到这个方法的定义时,你不会期望有一些副作用,如果你重新声明它,你会一直有副作用。从我的观点来看,我应该创建一些方法findOneBy…Join…,并在customUserM
FriendsOfSymfony/FOSUserBundle
(原则)。所有的工作都很好,除了我想用我的自定义选择器(查找方法)选择用户,因为我想制作一些关节
有没有比改变捆绑代码更好的方法
更新:
我知道可以使用customfindOneBy…
(来自我自己的repository类),但我认为这种方法是不正确的:当你看到这个方法的定义时,你不会期望有一些副作用,如果你重新声明它,你会一直有副作用。从我的观点来看,我应该创建一些方法findOneBy…Join…
,并在customUserManager
中使用它,或者使用它的某种委托在控制器中使用$this->getUser()
进行检索
更新2:
在我找到解决方案之后。。。我不认为我的问题是重复的。是的,扩展是关键,但是在这个问题中讨论了如何扩展(一些特定的类),在我的问题中,我得到的答案是扩展就是我所需要的。我的意思是,很难找到与我的问题类似的解决方案(至少,我在提问之前尝试过)。您可以定义自己的自定义存储库吗
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as FosUser;
/**
* @ORM\Entity(repositoryClass="Project\XBundle\Entity\Repository\UserRepository")
* @ORM\Table(name="users")
*/
class User extends FosUser
{
}
对于使用自定义存储库,最好的方法是
更新:
这是一个关于“为什么不创建一个扩展默认管理器的新服务并插入您自己的方法”的链接
您正在这样做:
$userManager = $container->get('fos_user.user_manager');
如果您创建自己的类扩展FOS\UserBundle\doctor\UserManager
,并将其作为服务挂载,您将能够调用
$users = $container
->get('your.super.new.user.manager.service')
->findByMyNewSuperMethod($args);
- 指向服务参数的链接
更新2: 我没有看到@chalasr的答案,但他给你指路,还有更好的,关于这个案件的官方文件* 摘录: 您可以通过以下方式替换用户管理器的默认实现: 定义服务实现 FOS\UserBundle\Model\UserManagerInterface并在 配置默认实现的id为 fos_user.user_manager.default
我猜您正在通过,
i、 e.
$this->container->get('fos_user.user_manager')
及其findUserByXXX
要做到这一点,Put12co22mer2是正确的,首先需要创建一个
方法findUserByXXX
使用EntityRepository::findOneBy
方法。因此,只需在自定义存储库中重新创建默认的
findOneBy
方法,就可以修改UserManager::findUserBy
方法的行为
例如:
// src/UserBundle/Entity/Repository/YourUserRepository.php
/**
* Custom findOneBy.
*/
public function findOneBy(array $criteria, array $orderBy = null)
{
// Build you custom Query with additional joins
}
与此类似,默认的UserManager::findUserByXXX
方法将使用您的YourUserRepository::findOneBy
方法,因此您可以通过调用它们来获得预期的结果
如果您想向
UserManager
添加一些自定义方法,.更新了我的问题,如果您能选中以覆盖UserManager,我将很高兴,我给出的答案比只显示服务声明的官方文档更完整。@chalasr您是对的,这个问题应该以重复的形式结束。更新了我的问题,如果你能检查一下,我会很高兴在我的答案的最后给出一个链接,告诉你如何扩展UserManager,你应该这样做你的自定义方法。另外,我给出的两种方法是从控制器更改getUser行为的唯一替代方法
// src/UserBundle/Entity/Repository/YourUserRepository.php
/**
* Custom findOneBy.
*/
public function findOneBy(array $criteria, array $orderBy = null)
{
// Build you custom Query with additional joins
}