2015-04-23 92 views
0

我需要在symfony2中根据用户名或emailadres找到一个用户对象。这不是用于登录,而是用于用户的其他操作。从多个提供者的用户名中找到用户[symfony2]

我可以简单地请求(Doctrine2)存储库,并从我的存储库类中的UserProviderInterface调用方法loadByUsername。

但是需要这样做的代码将用于多个项目,我需要它更通用一些。用户类/表可能不同,或者用户可能来自完全不同类型的提供者。

有没有办法像用户登录时使用Symfony2一样使用用户名来查找用户? 无论用户提供者在security.yml中如何配置,这种方式都可以工作。

Symfony2中是否有一些服务可以使用? 是否有一个“用户提供者服务”,我可以在其中调用类似“loadUserByUsername”的方法来尝试每个配置的提供者?

回答

1

一些刺探到的Symfony本身的SecurityBundle之后,我想通了以下内容:

鉴于这是您的security.yml:

providers: 
    AdministrationUser: 
     entity: 
      class: AdministrationBundle\Entity\User 

的Symfony将创建具有以下名称的服务:

security.user.provider.concrete.administrationuser 

此服务使用UserProviderInterface,当您获取此服务时,您可以简单地调用loadUserByName方法并找到您的用户。

所以你需要知道的是你自己配置的提供者的名字,你可以确定服务名并获取它。


我在一个更通用的情况,所以我增加了一个别名在扩展级我包的那个服务:

// alias the user_provider mentioned 
    $container->setAlias('my_security_bundle.user.provider', new Alias('security.user.provider.concrete.' . strtolower($config['user']['provider']))); 

其中$配置[“用户”] [”提供者']来自config.yml(并且需要在你的配置类中进行配置,但这是一个不同的故事)

现在我可以简单地使用该新别名,并且我将获得正确的服务以找到我的用户像这样的控制器:

/** @var UserProviderInterface $userProvider */ 
    $userProvider = $this->get('my_security_bundle.user.provider'); 
    $user = $userProvider->loadUserByUsername('[email protected]'); 
0
+0

这就是你如何配置用户提供者。问题是当我只有一个用户名时,我可以使用该配置来查找用户。 – DoppyNL

+0

你想使用你的用户名来寻找用户登录的提供者吗? – MouradK

+0

我有一个用户名并想获取用户对象。由于已经在security.yml中配置了用户提供程序,因此使用该信息是有意义的。但是我找不到任何允许我这样做的默认symfony服务。 – DoppyNL

相关问题