Static Factory в Symfony

283
21 декабря 2018, 15:10

Всем привет. Мне нужно в домене (в сущности) получать объект из базы данных.

/**
 * @return Money
 */
public function getAmountUAH()
{
    $itemsUAH = $this->cartItems->filter(function (CartItem $cartItem) {
        return $cartItem->getPrice()->getCurrency()->isUAH();
    });
    $amount = 0;
    /** @var CartItem $item */
    foreach ($itemsUAH as $item) {
        $amount += $item->getAmount()->getAmount();
    }
    $amountUAH = new Money();
    $amountUAH
        ->setAmount($amount)
        ->setCurrency(CurrencyFactory::createUAH())
    ;
    return $amountUAH;
}

Для этого я создал статический класс:

final class CurrencyFactory
{
    /**
     * @var EntityManagerInterface
     */
    private static $om;
    public static function setObjectManager(ObjectManager $objectManager)
    {
        self::$om = $objectManager;
    }
    public static function createUAH()
    {
        return self::$om->getRepository(Currency::class)->find(Currency::UAH);
    }
    public static function createEUR()
    {
        return self::$om->getRepository(Currency::class)->find(Currency::EUR);
    }
    public static function create(int $numberCode)
    {
        if ($numberCode === Currency::UAH) {
            return self::createUAH();
        } elseif ($numberCode === Currency::EUR) {
            return self::createEUR();
        }
        return null;
    }
}

Сейчас инициализирую фабрику в контроллере. Но это не то...

...
public function __construct(..., ObjectManager $objectManager)
{
...
    CurrencyFactory::setObjectManager($objectManager);
}
...

В каком месте и как мне лучше инициализировать фабрику? Может правильно было бы вообще пойти другим путем?

Используется Symfony 3.4

Answer 1

Пока сделал так:

В services.yml добавил:

CatalogBundle\Factory\CurrencyFactory:
    public: true

А в CurrencyFactory.php добавил конструктор:

public function __construct(ObjectManager $objectManager)
{
    self::$om = $objectManager;
}

Соответственно убрал из контроллера строку инициализации.

Answer 2

Приведу свое решение, для начала создаем listener

namespace AppBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class EntityListener {
    protected $container;
    function __construct($container) {
        $this->container = $container;
    }
    public function postLoad(LifecycleEventArgs $args) {
        $entity = $args->getEntity();

        if(method_exists($entity, 'setContainer')) {
            $entity->setContainer($this->container);
        }
    }
    public function postPersist(LifecycleEventArgs $args) {
        $entity = $args->getEntity();

        if(method_exists($entity, 'setContainer')) {
            $entity->setContainer($this->container);
        }
    }
}

Описываем его в services.yml для postLoad и postPersist

EntityListenerPL:
    class: AppBundle\EventListener\EntityListener
    arguments:
        - '@service_container'
    tags:
        - { name: doctrine.event_listener, event: postLoad }
EntityListenerPP:
    class: AppBundle\EventListener\EntityListener
    arguments:
        - '@service_container'
    tags:
        - { name: doctrine.event_listener, event: postPersist }

Соответственно контейнер будет пробрасываться и когда только персистим энтити и когда получаем ее из бд и только тогда когда у энтити есть метод setContainer. Сервисконтэйнер можно соответственно заменить на чтото свое.

READ ALSO
Из upstart в systemd

Из upstart в systemd

У меня Ubuntu 1804 не поддерживает upstart, использует systemd

151
Как получить статистику с Amazon Ses?

Как получить статистику с Amazon Ses?

Вопрос сушественый как получить статистику по каждому отправленому письму из рассылкиОбшее число я нашел собствено вот оно GetSendStatistics Вопрос...

208
Уменшить размер папки vendor

Уменшить размер папки vendor

Можно ли уменьшить папку vendor?

210
Phalcon не высылает cookie

Phalcon не высылает cookie

Пробую задать куки, как через setcookie, так и через $this->cookies->set/send, но почему то сервер не передает заголовки с куками, причем что самое интересное,...

158