Я добавил модуль ZfcUser в мое приложение Zend Framework 2. Но я должен использовать существующую таблицу базы данных, которая имеет несколько разные имена столбцов, чем структура таблицы по умолчанию для ZfcUser.
В вики-странице ZfcUser говорится, что можно использовать пользовательский mapper, если моя модель не соответствует предоставленному интерфейсу. И поскольку моя таблица базы данных отличается от значения по умолчанию, мой класс сущности пользователя также отличается от стандартного ZfcUser \ Entity \ User. Но я могу сказать, что ZfcUser легко работает с моим собственным классом, переопределяя настройку в файле config / autoload / zfcuser.global.php :
'user_entity_class' => 'MyApp\Entity\MyUser',
Но я не нашел простой способ сказать ZfcUser использовать мой класс mapper.
Я только обнаружил, что mapper создается ZfcUser \ Module :: getServiceConfig (), внутри которого я вижу, что mapper возвращается из его заводской функции:
// ... 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 использовать собственный пользовательский класс сопоставления?
У меня была такая же проблема, как у вас, но мне удалось войти в мое приложение. Я последовал совету Роба и создал свою собственную фабрику услуг в моем существующем пользовательском модуле. К сожалению, Бернхард также находится на месте. Вам нужно вникнуть в исходный код ZfcUser, чтобы заставить его работать. В проекте, над которым я сейчас работаю, есть сервер MSSQL, и я должен сказать, что было трудно получить представление о вещах. Я закончил настройку только одной функции в источнике ZfcUser, чтобы заставить страницу входа работать.
Мне нужна только функция входа в систему для текущего приложения, но предстоящий проект гораздо больше зависит от роли. Я искал то, что не было бы слишком сложным, чтобы быстро подключиться и в то же время предлагать больше возможностей и возможностей для будущего.
Вот что я сделал сейчас и что я узнал:
Я скопировал папки Entity и Mapper из каталога ZfcUser в мою существующую папку b2bUser (мой модуль). Все … даже папка Исключения внутри Mapper. Это может быть необязательно, но я не был в настроении выяснять зависимости.
В файле 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 (b2bUser) Скопировал в конфигурацию диспетчера служб следующее:
'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, чтобы отразить их новый дом. Изменен Entity и интерфейс, чтобы отразить мою собственную структуру данных. Я сделал то же самое с файлами Mapper и убедился, что имена переменных в файле Hydrator совпадают с именами столбцов базы данных.
Я оставил файл 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 есть запрос на перенос, который должен решить эту проблему: