Подтвердить что ты не робот

Создание переносных пакетов с расширяемыми объектами в Symfony2

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Шаги довольно сложны:

  • Создайте интерфейс в своем пакете для объекта User

    namespace Acme/UserBundle/Model;
    interface UserInterface
    {
        // public functions expected for entity User
    }
    
  • Сделайте свой базовый объект User реализованным интерфейсом

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

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

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

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

  • Расширить из класса User или реализовать UserInterface

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

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