ZF2: Пользовательский сопоставитель пользователей для модуля ZfcUser


Я добавил модуль ZfcUser в свое приложение Zend Framework 2. Но я должен использовать существующую таблицу базы данных, имена столбцов которой немного отличаются от структуры таблицы по умолчанию для ZfcUser.

В вики-странице ZfcUser говорится, что можно использовать пользовательский картограф, если моя модель не соответствует предоставленному интерфейсу. И поскольку моя таблица базы данных отличается от таблицы по умолчанию, мой класс сущности пользователя также отличается от стандартного ZfcUser\Entity\User. Но я могу легко указать ZfcUser работать с моим собственным классом , переопределив параметр в файле config/autoload/zfcuser.global.php:

'user_entity_class' => 'MyApp\Entity\MyUser',

Но я пока не нашел простого способа сказать ZfcUser, чтобы он использовал мой класс mapper.

Я только обнаружил, что сопоставитель создан ZfcUser\Module::getserviceconfig() внутри которого я вижу, что картограф возвращается из своей заводской функции:

// ...
public function getServiceConfig()
{
    return array(
    // ...
        'factories' => array(
            // ...
            'zfcuser_user_mapper' => function ($sm) {
                $options = $sm->get('zfcuser_module_options');
                $mapper = new Mapper\User();
                $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));
                $entityClass = $options->getUserEntityClass();
                $mapper->setEntityPrototype(new $entityClass);
                $mapper->setHydrator(new Mapper\UserHydrator());
                return $mapper;
            },
            // ...

Есть ли способ заставить ZfcUser использовать мой пользовательский класс сопоставления пользователей?

Author: Lukas Normantas, 2012-11-02

3 answers

У меня была та же проблема, что и у вас, но мне наконец удалось войти в свое приложение. Я последовал совету Роба и создал свою собственную фабрику услуг в рамках существующего пользовательского модуля. К сожалению, Бернард тоже попал в точку. Вам вроде как нужно покопаться в исходном коде ZfcUser, чтобы заставить его работать. В проекте, над которым я сейчас работаю, есть сервер MSSQL, и я должен сказать, что было сложно разобраться с этим. Я закончил тем, что настроил только одну функцию в источнике ZfcUser, чтобы получить страницу входа в работа.

Мне нужна только функция входа в систему для текущего приложения, но предстоящий проект гораздо более ориентирован на роль. Я искал что-то, что не было бы слишком сложным, чтобы быстро подключиться, и в то же время предлагало больше вариантов и возможностей на будущее.

Вот что я сделал на данный момент и чему я научился:

Я скопировал папки Entity и Mapper из каталога ZfcUser в свою существующую папку b2bUser (мой модуль). Всё...даже тот Папка исключений внутри картографа. Возможно, в этом и не было необходимости, но я был не в настроении выяснять зависимости.

В zfcuser.global.php файл, моя активная конфигурация выглядит следующим образом:

'user_entity_class' => 'b2bUser\Entity\User',
'enable_registration' => false,
'enable_username' => true,
'auth_identity_fields' => array( 'username' ),
'login_redirect_route' => 'home',
'enable_user_state' => false,

Я оставил остальные настройки по умолчанию. Я удалил опцию электронной почты из удостоверений подлинности, потому что они не будут использовать адреса электронной почты для входа в систему. user_entity_class - это тот, который я скопировал...

Module.php (Пользователь B2) Скопировал следующее в диспетчер служб конфигурация:

'zfcuser_user_mapper' => function ($sm) {
    $mapper = new Mapper\User();
    $mapper->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
    $mapper->setEntityPrototype(new Entity\User());
    $mapper->setHydrator(new Mapper\UserHydrator());
    return $mapper;
},

После завершения настройки я изменил пространства имен и т. Д. Файлов в Entity и Mapper, Чтобы отразить их новый дом. Изменил сущность и интерфейс, чтобы отразить мою собственную структуру данных. Я сделал то же самое с файлами сопоставления и убедился, что имена переменных в файле Гидратора совпадают с именами столбцов моей базы данных.

Я оставил файл AbstractDbMapper там, где он был. Но это файл, который я немного подправил.

Вот как выглядит мой. В SQLSRV водитель был полон пуха, все время жалуясь на какой-то предмет или веревку...

protected function select(Select $select, $entityPrototype = null, HydratorInterface $hydrator = null)
{
    $this->initialize();
    $selectString = $this->getSlaveSql()->getSqlStringForSqlObject($select);
    $stmt = $this->getDbAdapter()->driver->createStatement($selectString);
    $stmt->prepare();
    $res = $stmt->execute($stmt);

    $resultSet = new HydratingResultSet($hydrator ?: $this->getHydrator(),
            $entityPrototype ?: $this->getEntityPrototype());
    $resultSet->initialize($res);
    return $resultSet;
}

И это все. Я надеюсь, что это поможет кому-то, по крайней мере, запустить его и запустить в своей собственной системе. Я не оставлю свой так, но это была своего рода миссия - заставить его работать.

 4
Author: corl, 2012-12-15 02:58:29

Создайте свою собственную фабрику обслуживания для zfcuser_user_mapper, и она будет использоваться.

 3
Author: Rob Allen, 2012-11-24 14:21:00

В настоящее время, похоже, нет простого способа изменить структуру таблицы без изменения источника ZfcUser. На Github есть запрос на извлечение, который должен решить эту проблему:

Https://github.com/ZF-Commons/ZfcUser/pull/174

 0
Author: bernhard swoboda, 2012-11-08 16:32:52