Могу ли я в Zend_Auth получить объект User модели домена вместо stdClass?

Работая над частью входа в приложение, я столкнулся с проблемой:

Моя модель основана на Active Record путем расширения объектов Zend_Db_Table_Row. Всякий раз, когда мне приходится иметь дело с пользователем, я бы хотел сделать это через объект User (будучи расширенной строкой таблицы). Однако Zend_Auth_Adapter_DbTable::getResultRowObject() возвращает stdClass, и я не могу найти способ указать Zend_Auth_Adapter_DbTable использовать определенную Db_Table.

Мои три варианта, которые я нашел до сих пор:

  1. Напишите собственный Zend_Auth_Adapter, чтобы возвращать правильный объект класса (внутренне используя Zend_Db_Table).

  2. После аутентификации выполните чтение stdClass и запись объекта User. Можно ли создать класс Zend_Db_Table_Row, фактически не используя Zend_Db_Table для его создания?

  3. Перейдите от Active Record к полной разработке, управляемой доменом, отделив мой доступ к данным от пользовательского объекта. Затем напишите второй преобразователь для заполнения объекта User stdClass вместо строки таблицы.

Мои два вопроса: Что из этого вы бы порекомендовали? И есть ли что-то, что мне не хватает?

Я бы не хотел делать что-либо из этого, а затем обнаруживать, что мне не хватает чего-то очевидного в Framework. Кто-нибудь знает, есть ли "правильный" способ сделать это?

С уважением, Сандер


person kander    schedule 13.08.2009    source источник


Ответы (2)


Не существует «правильного» способа делать то, что вы хотите. Подходы, которые вы показываете, должны работать.

Лично я выступаю за то, чтобы хранить в Zend_Auth только идентификатор пользователя — если бы вы хранили полный объект со всеми данными пользователя, он бы не синхронизировался, если бы пользователь изменил свою информацию.

В проекте я однажды написал плагин контроллера, который предоставлял пользователю доступ к контроллерам. По сути, он взял идентификатор из Zend_Auth и создал на его основе пользовательский объект. Он также создал анонимный пользовательский объект на случай отсутствия идентификатора. Не сказать, что это лучший подход, но он прозрачен и работает.

person Jani Hartikainen    schedule 13.08.2009

В частности, я использую решение номер 2, у меня есть собственный объект Auth, который обертывает Zend_Auth, поэтому при входе в систему у меня есть это:

public function login($user, $password) {
    if(!($this->adapter instanceof Zend_Auth_Adapter_DbTable)) {
        throw new Gecko_Auth_Exception("The Adapter is not valid or not initialized");
    }

    $auth = Zend_Auth::getInstance();

    $this->adapter->setIdentity($user);
    $this->adapter->setCredential($password);

    $result = $auth->authenticate($this->adapter);
    if( $result->isValid() ) {
        $data = $this->adapter->getResultRowObject(null, $this->passwordColumn);
        $userObject = new self::$userClass($data);
        $auth->getStorage()->write($userObject);
        return true;
    } else {
        return false;
    }
}

Затем я могу вызвать Zend_Auth::getInstance, чтобы получить пользовательский объект UserClass, чтобы я мог сопоставить его с моим пользовательским классом Zend_Db_Table_Row.

Надеюсь, поможет

person Chris    schedule 13.08.2009