Создание переносимых комплектов с расширяемыми сущностями в Symfony2 - PullRequest
19 голосов
/ 21 марта 2012

Я хочу создать несколько пакетов Symfony2, которые можно повторно использовать в разных проектах, но где сущности также могут быть легко расширены при необходимости.

Примером может быть многоразовый UserBundle, который содержит сущность User со всемиопределены отображения ORM.Однако в моем приложении я мог бы захотеть расширить эту сущность и добавить дополнительные столбцы, ассоциации или переопределить некоторые из отображений родителя.

Наиболее близким решением, которое я мог бы найти, являются сопоставленные суперклассы Doctrine2, но тогда я бы потерялPlug-and-Playness моего многоразового пакета, мне всегда нужно было расширять сопоставленный суперкласс в моем приложении, даже если я не хочу изменять отображения.

Другие документированные схемы наследования требуют изменения родительского элементасопоставления, и тогда мой UserBundle больше не будет переносимым между проектами.

Есть ли способ определить полностью работающий объект в одном пакете, и при этом расширить его в другом пакете?

1 Ответ

11 голосов
/ 13 сентября 2013

Для дальнейшего использования это можно решить, используя разрешение целевого объекта .

. Дополнительную информацию можно найти в Документах Symfony .

.шаги довольно просты:

  1. Создайте интерфейс в вашем комплекте для User сущности

    namespace Acme/UserBundle/Model;
    interface UserInterface
    {
        // public functions expected for entity User
    }
    
  2. Создайте базу UserСущность реализует интерфейс

    namespace Acme/UserBundle/Entity;
    /**
     * @ORM\Entity
     */
    class User implements UserInterface
    {
        // implement public functions
    }
    
  3. Создайте отношения как обычно, но с использованием интерфейса

    namespace Acme/InvoiceBundle/Entity;
    /**
     * @ORM\Entity
     */
    class Invoice
    {
        /**
         * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface")
         */
        protected $user;
    }
    
  4. Настройте прослушиватель, добавив следующеев config.yml

    doctrine:
        # ....
        orm:
            # ....
            resolve_target_entities:
                Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User
    

Если вы хотите настроить User сущность для вашего текущего приложения

  1. Расширение от Userкласс или инструмент UserInterface

    namespace Acme/WebBundle/Entity;
    use Acme/UserBundle/Entity/User as BaseUser;
    /**
     * @ORM\Entity
     */
    class User extends BaseUser
    {
        // Add new fields and functions
    }
    
  2. Настройте слушателя соответственно

    doctrine:
        # ....
        orm:
            # ....
            resolve_target_entities:
                Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User
    
...