#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. Спасибо за ваш ответ. Это мне очень помогло 🙂