有什么方法可以让 select 用户使用自定义 select 或(查找方法)?

Is there any way to select user with custom selector (find method)?

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

有什么比 FoS 捆绑代码更改更好的方法吗?

更新:

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

进行检索

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

您可以定义自己的自定义存储库吗?

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 的 link,为什么不创建一个扩展默认管理器的新服务,并插入您自己的方法?

您正在这样做:

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

如果您创建自己的 class 扩展 FOS\UserBundle\Doctrine\UserManager 并将其安装为服务,您将能够调用

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

更新 2: 我没有看到@chalasr 的回答,但他给你指明了方向,有更好的方法,Overriding the User Manager,关于这个案例的官方文档...*

摘录:

You can replace the default implementation of the user manager by defining a service implementing FOS\UserBundle\Model\UserManagerInterface and setting its id in the configuration. The id of the default implementation is fos_user.user_manager.default

fos_user:
    # ...
    service:
        user_manager: custom_user_manager_id

我的猜测是您正在通过 FOSUB UserManager
处理 selects/inserts/updates 即 $this->container->get('fos_user.user_manager'); 及其 findUserByXXX.

要做到这一点,Put12co22mer2 是对的,首先你需要创建一个 custom Repository class.

方法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 添加一些自定义方法,override it