Всем привет. Мне нужно в домене (в сущности) получать объект из базы данных.
/**
* @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
Пока сделал так:
В services.yml добавил:
CatalogBundle\Factory\CurrencyFactory:
public: true
А в CurrencyFactory.php добавил конструктор:
public function __construct(ObjectManager $objectManager)
{
self::$om = $objectManager;
}
Соответственно убрал из контроллера строку инициализации.
Приведу свое решение, для начала создаем 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. Сервисконтэйнер можно соответственно заменить на чтото свое.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Вопрос сушественый как получить статистику по каждому отправленому письму из рассылкиОбшее число я нашел собствено вот оно GetSendStatistics Вопрос...
Пробую задать куки, как через setcookie, так и через $this->cookies->set/send, но почему то сервер не передает заголовки с куками, причем что самое интересное,...