Получить пользователя вместо Userinterface - PullRequest
0 голосов
/ 05 марта 2020

Как получить класс пользователя вместо Userinterface, когда я делаю:

$ this-> security-> getUser () (Security is Symfony \ Component \ Security \ Core \ Security;)

Примером (и это просто пример :), у меня есть эта пользовательская функция:

public function getUser(User $user){
}

, и когда я это делаю:

public function __construct(
        Security $security,
    ) {
        $this->security = $security;
    }

getUser($this->security->getUser());

У меня есть предупреждение:

getUser ожидает, что данное приложение \ Entity \ User, Symfony \ Component \ Security \ Core \ User \ UserInterface | пусто.

Ответы [ 2 ]

3 голосов
/ 05 марта 2020

Когда инструмент анализа кода, такой как phpstan или psalm, предупреждает вас о несоответствии типов, есть несколько способов с ним справиться.

Скорее всего, вы хотите изменить сигнатуру метода, а затем обработать случаи, сообщение жалуется, например, так:

public function getUser(UserInterface $user = null)
{
    if (null === $user || ! $user instanceof User) {
        // do something about the wrong types, that you might get from getSecurity()->getUser(), e.g. return or throw an exception
        throw Exception(sprintf('Expected App\\Entity\\User, got %s', $user === null ? 'null' : get_class($user)));
    }

    ... your logic
}

Теперь ваш метод принимает как интерфейс, так и ноль, которые могут попасть туда. Вы также можете выполнить обработку ошибок перед вызовом метода getUser и оставить все как есть, поэтому вместо getUser($this->security->getUser());:

$temporaryUser = $this->security->getUser();

if (!$temporaryUser instanceof User) {
    throw Exception(sprintf('Expected App\\Entity\\User, got %s', $user === null ? 'null' : get_class($user))); 
}

getUser($temporaryUser);

Если вы уверены, что код не столкнется с проблемами, вы можете также игнорируйте определенные сообщения об ошибках, создав phpstan.neon в вашем проекте root. См .: https://github.com/phpstan/phpstan#ignore -ошибка-сообщения-с-регулярными выражениями

0 голосов
/ 05 марта 2020

Если $this->security->getUser() вызывает базовый класс безопасности Symfony для возврата пользователя, всегда возвращает объект, реализующий UserInterface - это то, что определяет тип возврата этого класса (либо неявно через правильный тип возвращаемого значения или через PHPDo c). Это не может быть изменено вашим собственным приложением.

Чтобы преодолеть вашу проблему, ваш собственный метод getUser должен использовать этот интерфейс в качестве типа параметра своего аргумента. В этом методе вы можете проверить наличие более определенного c класса (например: if($argument instanceof User)), но не в сигнатуре функции метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...