Получить параметр маршрутизации в loadUserByUsername в UserRepository

#php #symfony

#php #symfony

Вопрос:

Привет, сообщество stackoverflow,

я хочу получить доступ к параметру маршрута в моем UserRepository. Есть ли какая-либо возможность сделать это?

1. Откройте страницу входа в систему

Существует множество экземпляров. Если вы откроете экземпляр exampleInstance, вы сможете войти в систему только в том случае, если вы зарегистрированы в этом экземпляре.

 http://mywebpage.com/exampleInstance
  

2. Получить пользователя в UserRepository

Пользователь загружается, если он зарегистрирован в вызываемом экземпляре.

 class UserRepository extends EntityRepository implements UserLoaderInterface
{
    public function loadUserByUsername($username)
    {        
        $instanceName = ...

        return $this->createQueryBuilder('u')
            ->join('u.instance', 'i')
            ->where('i.name = :instanceName AND u.email = :email')
            ->setParameter('instanceName', $instanceName)
            ->setParameter('email', $username)
            ->getQuery()
            ->getOneOrNullResult();
    }
}
  

Я пытался получить параметр с помощью запроса и сеанса, но я не могу получить доступ к этим службам.

Я следовал этому руководству, чтобы реализовать UserRepository.

Кто-нибудь может мне помочь? Спасибо 🙂

Ответ №1:

Вам нужно будет внедрить службу стека запросов в вашего пользовательского провайдера. Это немного сложно, потому что у вас нет доступа к конструктору вашего репозитория, поэтому вам нужно использовать инъекцию setter. Что-то вроде:

 use SymfonyComponentHttpFoundationRequestStack;

class UserRepository
{
    public function setRequestStack(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }
    public function loadUserByUsername($username)
    {        
        $request = $this->requestStack->getMasterRequest();
        ...
}
// services.yml
my.user_provider:
    class: 'MyBundleEntityUserRepository'
    factory: ['doctrine.orm.entity_manager','getRepository']
    arguments:  
        - 'MyBundleEntityUser'
     calls:
         - ['setRequestStack', ['@request_stack']]
  

Это должно в значительной степени сделать это. Если это кажется немного хакерским, то так оно и есть. Внедрение установщика следует использовать экономно.

Мне все равно, чтобы репозиторий реализовывал пользовательский интерфейс загрузки. Я думаю, что немного чище иметь свой собственный класс user provider и вводить в него репозиторий, а также стек запросов. Но в итоге вы получаете те же результаты.

Комментарии:

1. Спасибо за ваш ответ. Это мне очень помогло 🙂