有没有办法用自定义选择器(查找方法)选择用户?

时间:2016-03-19 19:32:06

标签: symfony doctrine-orm fosuserbundle

我使用FriendsOfSymfony/FOSUserBundle(学说)。一切正常,除了我想用我的自定义选择器(查找方法)选择用户,因为我想做一些关节。

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

更新

我知道使用自定义findOneBy...(来自我自己的存储库类)的可能性,但我认为这种方式不正确:当你看到这个方法的定义时你不会期待一些副作用,如果你重新声明它,你将永远拥有它们。从我的角度来看,我应该制作一些方法findOneBy...Join...并在自定义UserManager或其某种委托中使用它来在控制器中使用$this->getUser()进行检索。

UPDATE2: 找到解决方案后...我不认为我的问题与Extends UserManager in Symfony2 with FOSUserBundle重复。是的,扩展是关键,但在这个问题中,它讨论了如何扩展(某些特定的类),在我的解释中,我得到的答案是扩展是我需要的。我的意思是很难找到问题的解决方案,类似于我的问题(至少,我在问之前尝试过)。

2 个答案:

答案 0 :(得分:3)

我的猜测是你正在通过FOSUB UserManager处理选择/插入/更新,
$this->container->get('fos_user.user_manager');及其findUserByXXX

要做到这一点,Put12co22mer2是对的,你需要的第一件事就是创建一个custom Repository class

方法findUserByXXX使用EntityRepository::findOneBy方法 因此,您只需在自定义存储库中重新创建默认的UserManager::findUserBy方法即可修改findOneBy方法的行为。

示例:

// 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方法,因此您可以通过调用它们来获得预期的结果。

如果您想为UserManageroverride it添加一些自定义方法。

答案 1 :(得分: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
{   
}

对于使用自定义存储库,最好的是official doc

更新:

以下是关于FOSUserManager的链接,为什么不创建扩展默认管理器的新服务,并插入自己的方法?

你这样做:

$userManager = $container->get('fos_user.user_manager');

如果您创建自己的类FOS\UserBundle\Doctrine\UserManager并将其作为服务挂载,则可以调用

$users =  $container
                   ->get('your.super.new.user.manager.service')
                   ->findByMyNewSuperMethod($args);

更新2: 我没有看到@chalasr的答案,但他告诉你的方式,还有更好的,Overriding the User Manager,关于这个案子的官方文件...... *

提取:

  

您可以替换用户管理器的默认实现   定义服务实现   FOS \ UserBundle \ Model \ UserManagerInterface并在其中设置其ID   组态。默认实现的id是   fos_user.user_manager.default

fos_user:
    # ...
    service:
        user_manager: custom_user_manager_id