Zend Framework 2:如何在ZfcUser中使用我自己的User表


Zend Framework 2: How to use my own User table in ZfcUser

这是我上一个问题Zend Framework 2的后续问题:如何为ZfcUser创建自己的用户映射程序。

出了什么问题?在我的用户数据库表中,与ZfcUser通常使用的User_id相比,我使用id作为主键。这当然是不可能的。

好吧,那我做了什么?这里是一个总结。我创建了一个名为ZfcUserExtension的新模块。然后,我从ZfcUser复制了Mapper和Entity文件夹。然后,我在module.config.php中覆盖了工厂。在zfcuser.global.php中,我更改了user_entity_class以反映我的实体。

然后,我在user Mapper和UserHydrator.php 中的3个函数中将user_id更改为id

我现在可以用现在的问题登录并注册。之后,我尝试"更改密码"answers"更改电子邮件",这时我收到错误消息:
"字段列表"中的未知列"user_id"

从外观上看,它实际上进入了ZfcUser并使用了它。所以我现在的问题是,我还需要更改或复制什么?我必须在我的模块ZfcUserExtension中为用户/更改密码和用户/更改电子邮件设置一个路由,这是对的吗?但这是否意味着我也必须从ZfcUser复制控制器文件夹,或者我如何使用ZfcUser中的控制器,然后从我的模块中再次使用映射器?

有人知道我该怎么解决吗?我在这里真的迷路了。事先非常感谢。

编辑:在收到bitWorking的帮助后,我有一个正在运行的解决方案

bitWorking的以下解决方案只进行了一次更改。我必须包含mapField调用,并在提取函数中更改mapField。我不完全理解为什么我必须这样做,因为我本以为如果我在两个函数中都将user_id更改为id,它应该会起作用,但后来发现更新不起作用,因为没有可用的id。我还假设我必须扭转水合物函数中的映射,但事实并非如此。总而言之,如果我没有监督过任何其他问题,我会说它现在使用id而不是user_id作为主键。再次感谢bitWorking的大力帮助!

ZfcUserExtension/Mapper/UserHydrator.php

<?php 
namespace ZfcUserExtension'Mapper;
use Zend'Crypt'Password'PasswordInterface as ZendCryptPassword;
use Zend'Stdlib'Hydrator'ClassMethods;
use ZfcUser'Mapper'UserHydrator as ZfcUserUserHydrator;
class UserHydrator extends ZfcUserUserHydrator
{
  public function extract($object)
  {
    $this->guardUserObject($object);
    $data = parent::extract($object);
    // return $this->mapField('id', 'user_id', $data); //original from ZfcUser
    return $this->mapField('user_id', 'id', $data); // now it works
  }
  public function hydrate(array $data, $object)
  {
    $this->guardUserObject($object);        
    $data = $this->mapField('user_id', 'id', $data);
    return parent::hydrate($data, $object);
  }
}

逐步:

首先覆盖Module.php或Module.config.php中的工厂。您不必将其放置在文件夹/命名空间Factory'Mapper中,但目前我假设其结构与ZfcUser相同。

'factories' => array(
    'zfcuser_user_hydrator' => 'ZfcUserExtension'Factory'Mapper'UserHydratorFactory',
),

ZfcUser/Factory/Mapper/UserHydratorFactory.php复制到ZfcUserExtension/Factory/Mapper/UserHydratorFactory.php并将其更改为

namespace ZfcUserExtension'Factory'Mapper;
use Zend'Crypt'Password'Bcrypt;
use Zend'ServiceManager'FactoryInterface;
use Zend'ServiceManager'ServiceLocatorInterface;
use ZfcUserExtension'Mapper;
class UserHydratorFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $options = $serviceLocator->get('zfcuser_module_options');
        $crypto  = new Bcrypt;
        $crypto->setCost($options->getPasswordCost());
        return new Mapper'UserHydrator($crypto);
    }
}

现在创建文件ZfcUserExtension/Mapper/UserHydrator.php(扩展并覆盖方法)

namespace ZfcUserExtension'Mapper;
use Zend'Crypt'Password'PasswordInterface as ZendCryptPassword;
use Zend'Stdlib'Hydrator'ClassMethods;
use ZfcUser'Mapper'UserHydrator as ZfcUserUserHydrator;
class UserHydrator extends ZfcUserUserHydrator
{
    public function extract($object)
    {
        $this->guardUserObject($object);
        return parent::extract($object);
    }
    public function hydrate(array $data, $object)
    {
        $this->guardUserObject($object);
        return parent::hydrate($data, $object);
    }
}

如果您想将user_id更改为id,这应该会起作用。否则,请查看UserHydrator.php并更改mapField调用。注:未测试。。