Как вы расширяете сущность в Symfony2, как вы это делали в Symfony 1? - PullRequest
9 голосов
/ 09 декабря 2011

В старых версиях Symfony вы могли создавать новые объекты внутри объекта данных, расширяя класс модели расширенным подклассом.

Например, у меня была модель вопросника, в которой была таблица результатов.,В этой таблице результатов был класс модели Result.php, который использовался для установки и получения результатов с помощью Doctrine.Затем я использовал подкласс модели ResultPeer.php, чтобы добавить новую функцию к объекту Result, который получил результат и в зависимости от фиксированного набора порогов рассчитал оценку и соответствующий цвет.

В новой версии Symfony2 с использованием Doctrine2Я изо всех сил пытаюсь найти лучший способ сделать это.При создании сущности я могу найти только в документации возможность добавлять объекты на основе отношений структуры данных.

Я смотрел на репозитории сущностей, но, похоже, это не расширяет и не расширяет функциональность исходного объекта.,Кажется, он возвращает объекты данных на основе запросов, которые являются более сложными, чем стандартные функции запросов.

Я также рассмотрел службы, которые я могу использовать для сбора объекта, а затем с помощью объекта создаю новый массив, которыйвключает в себя этот объект и вновь созданные данные, но это просто кажется неправильным или не соответствует философии Symfony.

Кто-нибудь знает, как функции могут быть добавлены к существующему объекту данных.Я нашел это действительно полезным в старой версии Symfony, но не могу найти альтернативу в новой версии Symfony2.

1 Ответ

18 голосов
/ 09 декабря 2011

Расширение сущности - это путь.В мире Doctrine2 они говорят о наследовании.Вот пример кода.Он определяет BaseEntity, затем расширяется для создания BaseAuditableEntity и, наконец, существует User сущность, расширяющая BaseAuditableEntity.Хитрость заключается в использовании аннотации @Orm\MappedSuperclass.Эта схема наследования создаст одну таблицу, даже если в моем графе отношений есть три объекта.Затем все свойства будут объединены в одну таблицу.Созданная таблица будет содержать каждое свойство, сопоставленное через отношения, то есть свойства от BaseAuditableEntity и от User.Вот примеры кода:

Acme\WebsiteBundle\Entity\BaseEntity.php

namespace Acme\WebsiteBundle\Entity;

use Doctrine\ORM\Mapping as Orm;

/**
 * @Orm\MappedSuperclass
 */
class BaseEntity {

}

Acme\WebsiteBundle\Entity\BaseAuditableEntity.php

namespace Acme\WebsiteBundle\Entity;

use Doctrine\ORM\Mapping as Orm;

/**
 * @Orm\MappedSuperclass
 */
class BaseAuditableEntity extends BaseEntity {

    private $createdBy;

    /**
     * @Orm\Column(type="datetime", name="created_at")
     */
    private $createdAt;

    /**
     * @Orm\ManyToOne(targetEntity="User")
     * @Orm\JoinColumn(name="updated_by", referencedColumnName="id")
     */
    private $updatedBy;

    /**
     * @Orm\Column(type="datetime", name="updated_at")
     */
    private $updatedAt;

    // Setters and getters here
}

Acme\WebsiteBundle\Entity\User.php

namespace Acme\WebsiteBundle\Entity;

use Acme\WebsiteBundle\Entity\BaseAuditableEntity;

use Doctrine\ORM\Mapping as Orm;

/**
 * @Orm\Entity(repositoryClass="Acme\WebsiteBundle\Entity\Repository\UserRepository")
 * @Orm\Table(name="acme_user")
 */
class User extends BaseAuditableEntity implements AdvancedUserInterface, \Serializable
{
    /**
     * @Orm\Id
     * @Orm\Column(type="integer")
     * @Orm\GeneratedValue
     */
    private $id;

    /**
     * @Orm\Column(type="string", name="first_name")
     */
    private $firstName;

    /**
     * @Orm\Column(type="string", name="last_name")
     */
    private $lastName;

    /**
     * @Orm\Column(type="string", unique="true")
     */
    private $email;

    // Other properties

    // Constructor

    // Setters and getters
}

Вот ссылкак официальной документации по отображению наследования Doctrine 2.1: здесь

Надеюсь, это поможет, не стесняйтесь комментировать, если вам нужна дополнительная информация.

С уважением,Matt

...