我需要根据用户名或emailadres在symfony2中找到一个用户对象。这不适用于登录,但适用于用户的其他操作。
我可以简单地请求(Doctrine2)存储库并从我的存储库类上的UserProviderInterface调用方法loadByUsername。
但是需要执行此操作的代码将用于多个项目中,我需要它更通用一些。用户类/表可能不同,或者用户可能来自完全不同类型的提供者。
有没有办法按用户名查找用户,就像Symfony2本身登录时使用的一样? 这样,无论在security.yml中如何配置用户提供程序,它都将起作用。
我可以在Symfony2中使用一些服务吗? 是否有“用户提供商服务”,我可以调用类似“loadUserByUsername”的方法来尝试每个配置的提供商?
答案 0 :(得分:1)
在探索了Symfony的SecurityBundle后,我想出了以下内容:
鉴于这是在你的security.yml:
providers:
AdministrationUser:
entity:
class: AdministrationBundle\Entity\User
Symfony将使用以下名称创建服务:
security.user.provider.concrete.administrationuser
此服务使用UserProviderInterface,当您获取此服务时,您只需调用方法loadUserByName并找到您的用户。
所以您需要知道的是您自己配置的提供程序的名称,您可以确定服务名称并获取它。
我处于更通用的情况,所以我在我的bundle的Extension-class中为该服务添加了别名:
// alias the user_provider mentioned
$container->setAlias('my_security_bundle.user.provider', new Alias('security.user.provider.concrete.' . strtolower($config['user']['provider'])));
$ config ['user'] ['provider']来自config.yml(需要在Configuration类中配置,但这是另一回事。
现在我可以简单地使用新的别名,我将获得正确的服务,以便在控制器中找到我的用户,如下所示:
/** @var UserProviderInterface $userProvider */
$userProvider = $this->get('my_security_bundle.user.provider');
$user = $userProvider->loadUserByUsername('someone@somewhere.tld');
答案 1 :(得分:0)