@galithr

Как проверить соответствие экземпляра ActiveRecord определенному интерфейсу?

К примеру есть такой ActiveRecord
class User extends  \yii\db\ActiveRecord {

    public function rules(){
        return[
            [
                 'first_name',
                 'last_name',
                  'login'
            ],
            'string'
      ];
   }
}


его экземпляр передает в определенный метод. Как определить в этом методе что переданные данные это действительно экземпляр User и у него есть свойства first_name, last_name, login? ведь интерфейсы в PHP могут содержать только методы, а свойства не могут, соответсвенно instanceof здесь так же не поможет. Как быть?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 3
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Сделайте метод, который проверяет эти свойства
Ответ написан
Комментировать
bitver
@bitver
Вам нужен интерфейс со свойствами? Определите геттеры.

Если свойства обязаны быть со значением отличным от null, то можно просто проверять на !== nullкаждое свойство.
Ответ написан
Комментировать
DieZz
@DieZz
Используйте интерфейс для типизации модели и используйте явное указание типа аргумента в нужном методе. Например:
<?php

interface UserInterface
{
    public function getFirstName();

    public function getLastName();

    public function getLogin();
}

/**
 * Class User
 *
 * @property string $firstName
 * @property string $lastName
 * @property string $login
 */
class User extends \yii\db\ActiveRecord implements UserInterface
{
    ...

    public function getFirstName()
    {
        return $this->firstName;
    }

    public function getLastName()
    {
        return $this->lastName;
    }

    public function getLogin()
    {
        return $this->login;
    }

}

class TestController
{
    /**
     * Здесь явно указываем тип переменной, которую ожидаем. Если мы передадим
     * объект, который не имплиментирует нужный интерфейс, то будет ошибка.
     *
     * @param UserInterface $user
     */
    public function actionTest(UserInterface $user)
    {
        $name = $user->getFirstName();
        ...
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
if ($instance instanceof \path\to\User::className()) {
    echo 'Yeah';
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы