我使用FriendsOfSymfony/FOSUserBundle
(学说)。一切正常,除了我想用我的自定义选择器(查找方法)选择用户,因为我想做一些关节。
有没有比FoS
捆绑代码更改更好的方法?
更新
我知道使用自定义findOneBy...
(来自我自己的存储库类)的可能性,但我认为这种方式不正确:当你看到这个方法的定义时你不会期待一些副作用,如果你重新声明它,你将永远拥有它们。从我的角度来看,我应该制作一些方法findOneBy...Join...
并在自定义UserManager
或其某种委托中使用它来在控制器中使用$this->getUser()
进行检索。
UPDATE2: 找到解决方案后...我不认为我的问题与Extends UserManager in Symfony2 with FOSUserBundle重复。是的,扩展是关键,但在这个问题中,它讨论了如何扩展(某些特定的类),在我的解释中,我得到的答案是扩展是我需要的。我的意思是很难找到问题的解决方案,类似于我的问题(至少,我在问之前尝试过)。
答案 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
方法,因此您可以通过调用它们来获得预期的结果。
如果您想为UserManager
,override 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