Symfony Как получить пользователя из контейнера?

hell0w0rd

Продвинутый новичок
у меня есть контроллер, который работает с юзером. Но я не хочу его получать из security.context, а хочу инжектить конструктором/сеттером - не важно. Как это сделать?
Сейчас это так:
PHP:
    /**
     * @[USER=4683]var[/USER] User
     */
    private $user;

    /**
     * @param User $user
     */
    public function setUser(User $user)
    {
        $this->user = $user;
    }

    /**
     * @return User
     */
    public function getUser()
    {
        return $this->user === null ? parent::getUser() : $this->user;
    }
Но это как-то криво
 
Последнее редактирование:

keltanas

marty cats
Конечно криво. Потому-то юзер не должен быть сервисом ))
Прошу прощения за мой французский, но гланды же в жопе никто не хранит, чтобы их через нее было проще удалять )))
Напиши:
PHP:
public function getUser()
{
    return $this->get('security.context')->getToken()->getUser();
}
 

Вурдалак

Продвинутый новичок
Лучше сделать свой базовый контроллер, а там уже получать юзера из SecurityContext, но с нужным тебе типом в @return.

Кстати, в 2.4 добавили expression language, и можно будет определять зависимость как-то так:
Код:
services:
    foo.controller:
        class: FooController
        arguments: [@=service("security.context").getToken().getUser()]
Хотя мне такая идея не нравится.
 

hell0w0rd

Продвинутый новичок
Мне не нужен юзер из security.context, мне нужен вообще любой юзер. Например чтобы переопределить в тестах
 

hell0w0rd

Продвинутый новичок
Вурдалак
ну внутри приложения - конечно из контекста)
мне бы что-то вроде
PHP:
services:
    foo.controller:
        class: FooController
        arguments: [@=service("security.context").getToken().getUser()]
 

keltanas

marty cats
А нельзя сделать свой тестовый токен, который будет возвращать своего тестового юзера и перед тестом засунуть этот токен в security.context?
 

hell0w0rd

Продвинутый новичок
А нельзя сделать свой тестовый токен, который будет возвращать своего тестового юзера и перед тестом засунуть этот токен в security.context?
А нахрена тогда DI?
И тесты не должны зависить не от чего. Я по хорошему в этот контроллер на тестах должен мок юзера совать
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
PHP:
class FooController {
    public function __construct(UserInterface $user) {}
}
App::bind("UserInterface", function() {
    return new User();
});
$controller = App::make('FooController');
 

AmdY

Пью пиво
Команда форума
Кстати, пользователя для авторизации в laravel можно настраивать через конфиг
app/config/auth.php[model]
app/config/testing/auth.php[model] - для тестов.

Это функция которая действительно нужна всем, так что можно обойтись и инъекций, а так в большинстве случаев действует принцип YAGNI, а когда момент наступает можно найти компонент в расширениях.
 

keltanas

marty cats
hell0w0rd
не надо совать юзера в контроллер. Контроллер надо функциональными тестами тестить, а не вызывать его напрямую. Это же контроллер, все-таки. А юзером пусть рулит Security-компонент.
DI то DI, но совать все что попало и куда попало тоже не надо. Надо здравым смыслом руководствоваться, конечно.
 

hell0w0rd

Продвинутый новичок
Понял. Контроллеры не тестирую юнит-тестами. Спасибо)
Однако, так или иначе как в симфони заинжектить колбеком что-то?
 
Сверху