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 использовать мой пользовательский класс сопоставления пользователей?
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;
}
И это все. Я надеюсь, что это поможет кому-то, по крайней мере, запустить его и запустить в своей собственной системе. Я не оставлю свой так, но это была своего рода миссия - заставить его работать.
Создайте свою собственную фабрику обслуживания для zfcuser_user_mapper
, и она будет использоваться.
В настоящее время, похоже, нет простого способа изменить структуру таблицы без изменения источника ZfcUser. На Github есть запрос на извлечение, который должен решить эту проблему: