Symfony 是否有任何方法可以使用自定义选择器(查找方法)选择用户?

Symfony 是否有任何方法可以使用自定义选择器(查找方法)选择用户?,symfony,doctrine-orm,fosuserbundle,Symfony,Doctrine Orm,Fosuserbundle,我使用的是FriendsOfSymfony/FOSUserBundle(原则)。所有的工作都很好,除了我想用我的自定义选择器(查找方法)选择用户,因为我想制作一些关节 有没有比改变捆绑代码更好的方法 更新: 我知道可以使用customfindOneBy…(来自我自己的repository类),但我认为这种方法是不正确的:当你看到这个方法的定义时,你不会期望有一些副作用,如果你重新声明它,你会一直有副作用。从我的观点来看,我应该创建一些方法findOneBy…Join…,并在customUserM

我使用的是
FriendsOfSymfony/FOSUserBundle
(原则)。所有的工作都很好,除了我想用我的自定义选择器(查找方法)选择用户,因为我想制作一些关节

有没有比改变捆绑代码更好的方法

更新:

我知道可以使用custom
findOneBy…
(来自我自己的repository类),但我认为这种方法是不正确的:当你看到这个方法的定义时,你不会期望有一些副作用,如果你重新声明它,你会一直有副作用。从我的观点来看,我应该创建一些方法
findOneBy…Join…
,并在custom
UserManager
中使用它,或者使用它的某种委托在控制器中使用
$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
}