2015-04-23 3 views
0

Мне нужно найти пользовательский объект в symfony2 на основе имени пользователя или электронной почты. Это не для входа в систему, а для других действий пользователя.найти пользователя по имени пользователя от нескольких поставщиков [symfony2]

Я могу просто запросить репозиторий (Doctrine2) и вызвать метод loadByUsername из UserProviderInterface, который находится в моем классе репозитория.

Но код, который должен сделать это, будет использоваться в нескольких проектах, и мне нужно, чтобы он был более общим. Пользовательский класс/таблица может отличаться или пользователи могут поступать от совершенно другого типа провайдера.

Есть ли способ найти пользователя по имени пользователя, так же как сам Symfony2 используется при входе в систему? Таким образом, он будет работать независимо от того, как пользовательские провайдеры настроены в security.yml.

Есть ли какая-нибудь услуга в Symfony2, которую я могу использовать для этого? Есть ли «служба поставщика услуг», где я могу вызвать метод «loadUserByUsername», который будет проверять каждый настроенный поставщик?

ответ

1

После некоторого тыкать в SecurityBundle самой Symfony, я выяснил следующее:

Учитывая это в вашем 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 (и его необходимо настроить в вашем классе конфигурации, но это совсем другая история.

Теперь я могу просто использовать этот новый псевдоним, и я получу правильный сервис, чтобы найти моего пользователя в a Контроллер такой:

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

Если я понимаю ваш вопрос.

увидеть http://symfony.com/doc/current/cookbook/security/multiple_user_providers.html

+0

Так вы настраиваете поставщиков пользователей. Вопрос в том, как я могу использовать эту конфигурацию, чтобы найти пользователя, когда у меня есть только имя пользователя. – DoppyNL

+0

Вы хотите использовать провайдера, которому вы являетесь имя пользователя, чтобы найти пользователя для входа в систему? – MouradK

+0

У меня есть имя пользователя и вы хотите получить пользовательский объект. Поскольку уже есть поставщики пользователей, настроенные в security.yml, имеет смысл использовать эту информацию. Но я не могу найти службы symfony по умолчанию, которые позволяют мне это делать. – DoppyNL

Смежные вопросы