有什么方法可以让 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);
- Link 到 doctrine Fos services 服务参数...
更新 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。
我正在使用 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);
- Link 到 doctrine Fos services 服务参数...
更新 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。