加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Doctrine2自动生成的类中的自定义函数

发布时间:2020-12-13 17:48:27 所属栏目:PHP教程 来源:网络整理
导读:有没有办法扩展Doctrine2从数据库自动生成的类? 示例:我有这个由Doctrine生成的User类. ?phpnamespace Entities;/** * User */class User{ /** * @var integer */ private $id; /** * @var string */ private $firstName; /** * @var string */ private $l
有没有办法扩展Doctrine2从数据库自动生成的类?

示例:我有这个由Doctrine生成的User类.

<?php

namespace Entities;

/**
 * User
 */
class User
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $firstName;

    /**
     * @var string
     */
    private $lastName;


    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set firstName
     *
     * @param string $firstName
     *
     * @return User
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * Get firstName
     *
     * @return string
     */
    public function getFirstName()
    {
        return $this->firstName;
    }

    /**
     * Set lastName
     *
     * @param string $lastName
     *
     * @return User
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    /**
     * Get lastName
     *
     * @return string
     */
    public function getLastName()
    {
        return $this->lastName;
    }

我想添加这个功能:

public function getFullName()
{
    return $this->getFirstName().' '.$this->getLastname();
}

有没有比直接添加到这个类更简洁的方法?

我试图在库中创建另一个类(Test)并对其进行扩展,然后将其添加到autoload(这是有效的),但是当我尝试保存对象时出现错误:

class Test extends EntitiesUser {
    public function getFullName() {
        return $this->getFirstName().' '.$this->getLastname();
    }
}

Message: No mapping file found named ‘Test.dcm.yml’ for class ‘Test’.

我在CodeIgniter3中使用Doctrine2.

谢谢.

解决方法

如 Doctrine 2 FAQ中所述:

The EntityGenerator is not a full fledged code-generator that solves all tasks. […] The EntityGenerator is supposed to kick-start you,but not towards 100%.

简单来说,这意味着您要求Doctrine仅生成一次实体文件.在那之后,你可以自己做任何你喜欢(或需要)的改变.

因为实体不仅仅是某些属性的容器,而是整个操作发生的地方,这就是流程的发生方式,Doctrine无法为您编写更多代码.

向Doctrine生成的存根实体添加功能的唯一方法是通过根据域模型中的角色编写实现每个实体功能的代码来完成生成的类.

关于另一个问题,在Test类上,错误消息是不言自明的:传递给EntityManager进行处理的任何类都需要映射.

请查看有关Inheritance Mapping的帮助页面.您可以将类User映射为Mapped Superclass(它类似于派生类的模板,其实例不会保留在数据库中),或者您可以使用Single Table Inheritance来存储所有实例在单个表中从User派生的类(当它们具有相同的属性但行为不同时很有用).

或者,如果您因为害怕修改Doctrine生成的代码而创建了类Test,请在类User中放置您需要的行为并删除类Test.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读