2012-11-01 53 views
6

我在Zend Framework 2應用程序中添加了模塊ZfcUser。 但我必須使用現有的數據庫表, ,其列名與ZfcUser的默認表結構略有不同。ZF2:ZfcUser模塊的自定義用戶映射器

ZfcUser wiki page它表示如果我的模型不符合提供的接口,則可以使用自定義映射器。 由於我的數據庫表與默認值不同,我的用戶實體類也不同於標準ZfcUser \ Entity \ User的 。但我可以告訴ZfcUser通過重寫文件配置/自動加載/ zfcuser.global.php設置與我自己的類容易 工作:

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

但I`ve沒有找到一個簡單的方法來告訴ZfcUser到到目前爲止使用我的mapper類。

我只發現映射器由ZfcUser \模塊:: 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使用我的自定義用戶映射類?

回答

4

我和你有同樣的問題,但終於設法登錄到我的應用程序。我遵循Rob的建議,並在我現有的用戶模塊中創建了自己的服務工廠。不幸的是,伯恩哈德也是現貨。您需要深入瞭解ZfcUser源代碼才能使其運行。我現在正在開發的這個項目有一個MSSQL服務器,我必須說,處理事情一直很困難。我最終只調整了ZfcUser源中的一個函數來使登錄頁面正常工作。

我只需要登錄當前應用程序的功能,但即將推出的項目更多的角色驅動。我一直在尋找一些不會太複雜的東西來快速連接,同時爲未來提供更多的選擇和可能性。

這裏是我做過什麼,現在和我學到的東西:

我複製從ZfcUser目錄的實體和映射文件夾到我現有的b2bUser(我的模塊)的文件夾。一切......甚至是Mapper內的Exception文件夾。這可能沒有必要,但我沒有心情找出依賴關係。

在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文件也做了同樣的事情,並確保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

非常感謝!我正在尋找相同的信息,並在您的文章的幫助下,我設法重新加載了zfcUser的Entity和Mapper類以用於我的數據庫和實體的擴展功能! – Brock

3

Ceate自己的服務工廠zfcuser_user_mapper,它會習慣。

+1

是的,這就是我正在尋找的。問題是如何去做。 –

+1

將zfcuser_user_mapper的條目添加到您的Module.php中。確保您的模塊在ZfcUser之後加載,它將覆蓋默認值。現在看到配置了zfcuser_user_mapper,請參閱ZfcUser的Module.php。我很驚訝自定義表的問題已經存在了一段時間,而官方代碼庫沒有改變。你可能想看看我的fork在https://github.com/thoaionline/ZfcUser – thoaionline