我正在开发我的第一个Zend Framework 2项目。我在我的项目中实现了ZfcUser,因为我的数据库表中的列略有不同,我想从ZfcUser覆盖User Mapper。我已经通过互联网搜索了这里,但没有得到解决方案。我必须承认我找到的解决方案是从2012年开始的(ZF2: Custom user mapper for ZfcUser module),所以在此期间可能会发生一些变化。
所以到目前为止我做了什么。我创建了自己的用户实体。如果我理解正确,那么它需要扩展我所做的ZfcUser:
模块/应用/ SRC /实体/ user.php的
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
use ZfcUser\Entity\User as ZfcUser;
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User extends ZfcUser
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=255, nullable=false)
*/
protected $username;
然后我复制了zfcuser.global.php并将其移到了文件夹config / autoload / zfcuser.global.php
在此文件中,我已激活'user_entity_class'=> “应用程序\实体\用户”, 我希望到目前为止这是正确的。
现在我需要自己的UserMapper。据我所知,这不能通过配置文件完成。我将文件夹“Mapper”及其所有文件从zfc-user / src / ZfcUser / Mapper复制到我的应用程序模块中。我从所有文件中更改了命名空间。现在我很困惑我还需要复制什么,服务和/或工厂文件夹?在哪里以及如何告诉我的应用程序使用我自己的Mapper而不是ZfcUser?我只是不明白,希望有人能给我一些帮助。非常感谢你提前!
答案 0 :(得分:0)
ZfcUser只是向服务管理器询问UserMapper的实例。他们使用的别名称为'zfcuser_user_mapper'。
因此,如果您将该别名链接到您自己的UserMapper,那么您应该很高兴。 您可以在模块的module.config.php文件中设置它,即:
'service_manager' => array(
'invokables' => array(
'MyModule\Mapper\UserMapper' => 'MyModule\Mapper\UserMapper',
),
'aliases' => array(
'zfcuser_user_mapper' => 'MyModule\Mapper\UserMapper',
),
),
或者您也可以在getServiceConfig()中的Module.php中进行设置。
确保在application.config.php中的ZfcUser之后加载自己的模块。
请注意,我没有对此进行过测试,但从理论上说它应该可行。
编辑(2014/09/24) 由于您收到错误消息名称为“zfcuserusermapper”或“zfcuser_user_mapper”的别名已存在,请尝试直接在您自己的模块中覆盖工厂。在您自己的模块的module.config.php中:
'service_manager' => array(
'factories' => array(
// Override ZfcUser User Mapper factory
'zfcuser_user_mapper' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$mapper = new MyModule\Mapper\User($sm->get('Zend\Db\Adapter\Adapter'));
$entityClass = $options->getUserEntityClass();
$mapper->setHydrator(new ZfcUser\Mapper\UserHydrator());
$mapper->setTableName($options->getTableName());
return $mapper;
},
)
),
答案 1 :(得分:0)
谢谢Ruben和他的建议。我不得不稍微改变它以使其工作,因为我使用的是最新的Zend Framework 2.
我将在此处描述我的错误消息和解决方案,以防万一其他人将面临同样的问题。
<强> module.php 强>
// This solution did not work for me
public function getServiceConfig()
{
return array(
'service_manager' => array(
'factories' => array(
// Override ZfcUser User Mapper factory
'zfcuser_user_mapper' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$mapper = new MyModule\Mapper\User($sm->get('Zend\Db\Adapter\Adapter'));
$entityClass = $options->getUserEntityClass();
$mapper->setHydrator(new ZfcUser\Mapper\UserHydrator());
$mapper->setTableName($options->getTableName());
return $mapper;
},
)
);
}
首先,我必须删除&#39; service_manager&#39; =&GT; array(),否则代码完全被忽略,并使用了普通的ZfcUser。删除后我收到3条错误消息。
<强> 1。可捕获致命错误:传递给ZfcUser \ Mapper \ UserHydrator :: __ construct()的参数1必须是Zend \ Crypt \ Password \ PasswordInterface的实例,没有给出,
修复它,我不得不改变它:
$mapper->setHydrator(new ZfcUser\Mapper\UserHydrator());
到此代码:
$mapper->setHydrator($sm->get('zfcuser_user_hydrator'));
之后我收到了下一条错误消息:
<强> 2。没有数据库适配器
再一些代码需要改变:
$mapper = new MyModule\Mapper\User($sm->get('Zend\Db\Adapter\Adapter'));
进入这个
$mapper = new \ZfcUserExtension\Mapper\User();
$mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));
最后一条错误消息
<强> 3。没有实体原型设置
当我添加以下行时,此消息消失了:
$mapper->setEntityPrototype(new $entityClass);
现在是最终的工作代码:
public function getServiceConfig()
{
return array(
'factories' => array(
'zfcuser_user_mapper' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$mapper = new \ZfcUserExtension\Mapper\User();
// No db adapter present add below line
$mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));
$entityClass = $options->getUserEntityClass();
// No entity prototype set add below line
$mapper->setEntityPrototype(new $entityClass);
$mapper->setHydrator($sm->get('zfcuser_user_hydrator'));
$mapper->setTableName($options->getTableName());
return $mapper;
},
)
);
}
我最终将ZfcUser中的Mapper和Entity文件夹复制到名为ZfcUserExtension的模型中。然后我在UserMapper中将数据库列名从user_id更改为id。我现在可以登录并注册新的列名。
不幸的是我还无法使用更改密码,因为它仍在使用user_id,我还没有找到设置的位置以及如何覆盖它,但我会更新发布时,我找到了解决方案。如果有人知道这个问题的解决方案,那么请随时分享。
非常感谢@Ruben的帮助!!