这是我上一个问题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
调用。注:未测试。。