<?php/** * Base Page Manager * * @author Vincent van Waasbergen <v.vanwaasbergen@visualmedia.nl> */namespace VisualMedia\PageBundle\Manager;use Exception;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\ORM\EntityManagerInterface;use Doctrine\ORM\Mapping\ClassMetadata;use Symfony\Component\Serializer\Serializer;use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;use Symfony\Contracts\Translation\TranslatorInterface;use VisualMedia\LisaBundle\Component\ManagerData;use VisualMedia\PageBundle\Repository\BasePageRepository;use VisualMedia\PageBundle\Entity\BasePage;use VisualMedia\PageBundle\Entity\BasePageContent;use VisualMedia\TranslationBundle\Service\ChannelProvider;/** * Base Page Manager */class BasePageManager extends BasePageRepository{ /** * @var TranslatorInterface */ protected $translator; /** * @var ChannelProvider */ protected $channelProvider; /** * {@inheritdoc} */ public static function getEntityName(): string { return BasePage::class; } /** * @param TranslatorInterface $translator * @param ChannelProvider $channelProvider */ public function initialize(TranslatorInterface $translator, ChannelProvider $channelProvider): void { $this->translator = $translator; $this->channelProvider = $channelProvider; } /** * @param string $key * @param array $properties * @return BasePage */ public function getOrCreatePage(string $key, array $properties): BasePage { if (!$this->translator) { throw new Exception('Translator is not configured.'); } $slug = $this->translator->trans(sprintf('%s.slug', $key), [], 'pages'); $managerData = new ManagerData([ static::OPTION_SLUG => $slug, static::OPTION_CHANNEL => $channel = $this->channelProvider->getCurrentChannel(), ]); if (null === $page = $this->getFirst($managerData)) { $normalizer = new ObjectNormalizer(); $serializer = new Serializer(array($normalizer)); $page = $serializer->denormalize($properties, static::getEntityName()); $page->channels = new ArrayCollection(); $page->slug = $slug; $page->systemPage = true; if ($channel !== null) { $page->channels->add($channel); } $content = $serializer->denormalize($properties, BasePageContent::class); $content->page = $page; $content->slug = $slug; $content->channel = $channel; $content->locale = $locale = $this->channelProvider->getCurrentLocale(); $page->contents->add($content); $this->persist($page); $this->flush(); } return $page; }}