2012-11-01 3 views
6

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

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

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

Но I`ve не нашел легкий способ сказать 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 использовать мой пользовательский класс mapper?

ответ

4

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

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

Вот что я сейчас и то, что я узнал:

Я скопировал папки сущностей и 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 является тот, который я скопировал ...

Модуль.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; 
}, 

После того, как установка была сделана, я изменил пространство имен и т.д. файлов в Сущности и 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; 
} 

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

+0

Большое спасибо! Я искал ту же самую информацию, и с помощью вашего сообщения мне удалось перезагрузить классы Entity и Mapper zfcUser, которые будут использоваться с моей БД и расширенными функциями Entity! – Brock

0

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

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

3

Цеат ваша собственная служба завода по zfcuser_user_mapper и привыкнет.

+1

Да, именно это я и ищу. Вопрос в том, как это сделать. –

+1

добавьте запись для zfcuser_user_mapper в свой файл Module.php. убедитесь, что ваш модуль загружен после ZfcUser, он перезапишет значение по умолчанию. для просмотра теперь настроен zfcuser_user_mapper, см. Module.php ZfcUser. Я удивлен, что проблема пользовательской таблицы была там некоторое время без изменения официальной кодовой базы. вы можете взглянуть на свою вилку на https://github.com/thoaionline/ZfcUser – thoaionline