6

我对ZF2很陌生。我在 ZF1 的项目中有一堆学说实体,其中一个是用户实体。

我正在尝试扩展 \ZfcUserDoctrineORM\Entity\User 以便我可以包含我的旧关系 - 但没有取得很大成功。

如果我尝试运行模式生成器./doctrine-module orm:schema-tool:create,我会收到一条错误消息,指出表名用户已经存在。

到目前为止,我已经尝试扩展类并将我的类设置为 UserEntityClass

return array(
    'zfcuser' => array(
        'UserEntityClass' => '\Application\Entity\User',
    ),
);

该模块似乎还没有任何文档。

4

3 回答 3

7

所以问题是默认的 ZfcUserDoctrineORM 实体仍在使用中。要解决此问题,您可以将 EnableDefaultEntities 设置为 false,如下所示:

return array(
    'zfcuser' => array(
        'UserEntityClass' => '\Acme\Entity\User',
        'EnableDefaultEntities' => false
    ),
);
于 2012-09-27T19:03:12.487 回答
2

我从记忆中走出来,因为我曾经玩过 ZfcUser[DoctrineORM] 。

你不想扩展任何东西。相反,只需编写您自己的用户实体并使其实现 ZfcUser\Entity\UserInterface。

然后确保您正确设置了配置(使用您自己的 UserInterface 实现,而不是默认的),您应该一切顺利。

于 2012-09-25T22:15:52.740 回答
0

尽管OP的答案是正确的,但它并不完整。下面我做了什么以及为什么。

创建自己的用户实体。AbstractEntity 是用于我所有实体的一种,仅包含 ID 属性、getter/setter 和一些用于实体调试的全局功能。

用户.php

use Doctrine\ORM\Mapping as ORM;
use Keet\Mvc\Entity\AbstractEntity;
use ZfcUser\Entity\UserInterface;

/**
 * Entity Class representing a post of our User module.
 *
 * @ORM\Entity
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="Keet\User\Repository\UserRepository")
 * @ORM\HasLifecycleCallbacks
 */
class User extends AbstractEntity implements UserInterface
{
    /**
     * @var string
     * @ORM\Column(name="username", type="string", length=255, unique=true, nullable=false)
     */
    protected $username;

    /**
     * @var string
     * @ORM\Column(name="email", type="string", length=255, unique=true, nullable=false)
     */
    protected $email;

    /**
     * @var string
     * @ORM\Column(name="display_name", type="string", length=255, nullable=false)
     */
    protected $displayName;

    /**
     * @var string
     * @ORM\Column(name="`password`", type="string", length=255, nullable=false)
     */
    protected $password;

    /**
     * @var int
     * @ORM\Column(name="state", type="integer", length=3, nullable=false)
     */
    protected $state = 1;

    // Getters/Setters
}

zfcuser.config.php

包含与OP 的答案相同的配置:

'zfcuser' => [
    //Some other config
    'userEntityClass' => User::class,
    'EnableDefaultEntities' => false,
],

模块.config.php

重要提示:覆盖 zfcuser 的默认学说实体配置!

'doctrine' => [
    'orm_autoload_annotations' => true,
    'driver' => [
        __NAMESPACE__ . '_driver' => [
            'class' => 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver',
            'cache' => 'array',
            'paths' => [
                __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src'
                . DIRECTORY_SEPARATOR . 'Entity',
            ]
        ],
        'orm_default'             => [
            'drivers' => [
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver',
                'ZfcUser\Entity'  => __NAMESPACE__ . '_driver'
            ],
        ],
        'zfcuser_entity' => [ // Section overwrites the default config for location of Annotation. Original found
            // in vendor ZfcUserDoctrineModule /config/xml/zfcuser/ZfcUser.Entity.User.dcm.xml
            'class' => 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver',
            'paths' =>
                __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src'
                . DIRECTORY_SEPARATOR . 'Entity',
        ],
    ],
],

在上面你通常只有'driver'and 'orm_default'配置。ZfcUser 模块包含一个'zfcuser_entity'配置,但将其指向它自己的模块中的驱动程序。要没有对不同驱动程序的浮动引用,请将其覆盖并将其指向您自己定义的驱动程序,由__NAMESPACE__ . '_driver'. 此外,在我的示例中,我使用了AnnotationDriverfor reading 注释,而 ZfcUser 模块使用了XmlDriver. ZfcUser 模块配置如下

这是原始配置,在上面的示例中被覆盖

'zfcuser_entity' => array(
    'class' => 'Doctrine\ORM\Mapping\Driver\XmlDriver',
    'paths' => __DIR__ . '/xml/zfcuser'
),

此配置允许您完全使用自己的实体,但仍使用 ZfcUser 模块。

在我的情况下,我可以将我自己的AbstractActionController操作与我自己编写的 CRUD 操作一起使用,这需要一个AbstractEntity. 这节省了大量的写作/思考;)

于 2017-05-30T07:42:30.163 回答