Completed
Pull Request — master (#433)
by Paul
06:40
created

PageBundle/EventSubscriber/PageSubscriber.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Victoire\Bundle\PageBundle\EventSubscriber;
4
5
use Doctrine\Common\EventSubscriber;
6
use Doctrine\ORM\EntityManager;
7
use Doctrine\ORM\Event\LifecycleEventArgs;
8
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
9
use Doctrine\ORM\Event\OnFlushEventArgs;
10
use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
11
use Doctrine\ORM\UnitOfWork;
12
use Gedmo\Translatable\TranslatableListener;
13
use Symfony\Bundle\FrameworkBundle\Routing\Router;
14
use Victoire\Bundle\CoreBundle\Entity\View;
15
use Victoire\Bundle\CoreBundle\Entity\WebViewInterface;
16
use Victoire\Bundle\PageBundle\Helper\UserCallableHelper;
17
use Victoire\Bundle\TemplateBundle\Entity\Template;
18
use Victoire\Bundle\TwigBundle\Entity\ErrorPage;
19
use Victoire\Bundle\ViewReferenceBundle\Builder\ViewReferenceBuilder;
20
use Victoire\Bundle\ViewReferenceBundle\Connector\ViewReferenceRepository;
21
use Victoire\Bundle\ViewReferenceBundle\ViewReference\ViewReference;
22
23
/**
24
 * This class listen Page Entity changes.
25
 */
26
class PageSubscriber implements EventSubscriber
27
{
28
    protected $router;
29
    protected $userClass;
30
    protected $userCallableHelper;
31
    protected $urlBuilder;
32
    protected $viewReferenceRepository;
33
34
    /**
35
     * Constructor.
36
     *
37
     * @param Router                  $router                  @router
38
     * @param UserCallableHelper      $userCallableHelper      @victoire_page.user_callable
39
     * @param string                  $userClass               %victoire_core.user_class%
40
     * @param ViewReferenceBuilder    $viewReferenceBuilder
41
     * @param ViewReferenceRepository $viewReferenceRepository
42
     * @param TranslatableListener    $translatableListener
43
     *
44
     * @internal param ViewReferenceBuilder $urlBuilder @victoire_view_reference.builder
45
     */
46
    public function __construct(
47
        Router $router,
48
        UserCallableHelper $userCallableHelper,
49
        $userClass,
50
        ViewReferenceBuilder $viewReferenceBuilder,
51
        ViewReferenceRepository $viewReferenceRepository,
52
        TranslatableListener $translatableListener
53
    ) {
54
        $this->router = $router;
55
        $this->userClass = $userClass;
56
        $this->userCallableHelper = $userCallableHelper;
57
        $this->viewReferenceBuilder = $viewReferenceBuilder;
58
        $this->viewReferenceRepository = $viewReferenceRepository;
59
        $this->translatableListener = $translatableListener;
60
    }
61
62
    /**
63
     * bind to LoadClassMetadata method.
64
     *
65
     * @return string[] The subscribed events
66
     */
67
    public function getSubscribedEvents()
68
    {
69
        return [
70
            'loadClassMetadata',
71
            'postLoad',
72
            'onFlush',
73
        ];
74
    }
75
76
    /**
77
     * @param OnFlushEventArgs $eventArgs
78
     */
79
    public function onFlush(OnFlushEventArgs $eventArgs)
80
    {
81
        /** @var EntityManager $entityManager */
82
        $entityManager = $eventArgs->getEntityManager();
83
        /** @var UnitOfWork $uow */
84
        $uow = $entityManager->getUnitOfWork();
85
86
        foreach ($uow->getScheduledEntityInsertions() as $entity) {
87
            if ($entity instanceof View) {
88
                $entity->setAuthor($this->userCallableHelper->getCurrentUser());
89
            }
90
        }
91
    }
92
93
    /**
94
     * Insert enabled widgets in base widget DiscriminatorMap.
95
     *
96
     * @param LoadClassMetadataEventArgs $eventArgs
97
     */
98
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
99
    {
100
        $metadata = $eventArgs->getClassMetadata();
101
102
        //set a relation between Page and User to define the page author
103
        $metaBuilder = new ClassMetadataBuilder($metadata);
104
105
        //Add author relation on view
106 View Code Duplication
        if ($this->userClass && $metadata->name === 'Victoire\Bundle\CoreBundle\Entity\View') {
107
            $metadata->mapManyToOne([
108
                'fieldName'    => 'author',
109
                'targetEntity' => $this->userClass,
110
                'cascade'      => ['persist'],
111
                'inversedBy'   => 'pages',
112
                'joinColumns'  => [
113
                    [
114
                        'name'                 => 'author_id',
115
                        'referencedColumnName' => 'id',
116
                        'onDelete'             => 'SET NULL',
117
                    ],
118
                ],
119
            ]);
120
        }
121
122
        // if $pages property exists, add the inversed side on User
123
        if ($metadata->name === $this->userClass && property_exists($this->userClass, 'pages')) {
124
            $metaBuilder->addOneToMany('pages', 'Victoire\Bundle\CoreBundle\Entity\View', 'author');
125
        }
126
    }
127
128
    /**
129
     * If entity is a View
130
     * it will find the ViewReference related to the current view and populate its url.
131
     *
132
     * @param LifecycleEventArgs $eventArgs
133
     */
134
    public function postLoad(LifecycleEventArgs $eventArgs)
135
    {
136
        $entity = $eventArgs->getEntity();
137
138
        if ($entity instanceof View) {
139
            $om = $eventArgs->getObjectManager();
0 ignored issues
show
$om is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
140
            $viewReferences = $this->viewReferenceRepository->getReferencesByParameters([
141
                'viewId'     => $entity->getId(),
142
                'templateId' => $entity->getId(),
143
            ], true, false, 'OR');
144
            foreach ($viewReferences as $viewReference) {
145
                if ($entity instanceof WebViewInterface && $viewReference instanceof ViewReference) {
146
                    $entity->setReference($viewReference, $viewReference->getLocale());
147
                    $entity->setUrl($viewReference->getUrl());
148
                } elseif ($entity instanceof Template || $entity instanceof ErrorPage) {
149
                    $entity->setReferences([$entity->getCurrentLocale() => new ViewReference($entity->getId())]);
150
                } else {
151
                    $entity->setReferences([
152
                        $entity->getCurrentLocale() => $this->viewReferenceBuilder->buildViewReference($entity, $eventArgs->getEntityManager()),
153
                    ]);
154
                }
155
            }
156
        }
157
    }
158
}
159