Completed
Push — master ( 65c91b...7e9231 )
by Guillaume
15:59
created

AbstractManager::getPutOptionResolver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
1
<?php
2
3
namespace Starkerxp\StructureBundle\Manager;
4
5
use DateTime;
6
use Doctrine\ORM\EntityManager;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Starkerxp\StructureBundle\Manager\EntityManager.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
7
use Doctrine\ORM\EntityRepository;
8
use Starkerxp\StructureBundle\Entity\Entity;
9
use Starkerxp\StructureBundle\Manager\Exception\ObjectClassNotAllowedException;
10
use Symfony\Component\OptionsResolver\OptionsResolver;
11
12
abstract class AbstractManager implements ManagerInterface
13
{
14
    /** @var EntityManager */
15
    protected $entityManager;
16
17
    /** @var EntityRepository */
18
    protected $repository;
19
20
    /**
21
     * @param EntityManager $entityManager
22
     * @param $entity
23
     */
24
    public function __construct(EntityManager $entityManager, $entity)
0 ignored issues
show
Bug introduced by
You have injected the EntityManager via parameter $entityManager. This is generally not recommended as it might get closed and become unusable. Instead, it is recommended to inject the ManagerRegistry and retrieve the EntityManager via getManager() each time you need it.

The EntityManager might become unusable for example if a transaction is rolled back and it gets closed. Let’s assume that somewhere in your application, or in a third-party library, there is code such as the following:

function someFunction(ManagerRegistry $registry) {
    $em = $registry->getManager();
    $em->getConnection()->beginTransaction();
    try {
        // Do something.
        $em->getConnection()->commit();
    } catch (\Exception $ex) {
        $em->getConnection()->rollback();
        $em->close();

        throw $ex;
    }
}

If that code throws an exception and the EntityManager is closed. Any other code which depends on the same instance of the EntityManager during this request will fail.

On the other hand, if you instead inject the ManagerRegistry, the getManager() method guarantees that you will always get a usable manager instance.

Loading history...
25
    {
26
        $this->entityManager = $entityManager;
27
        $this->repository = $this->entityManager->getRepository($entity);
28
    }
29
30
    /**
31
     * @param Entity $object
32
     *
33
     * @return Entity|boolean
34
     *
35
     * @throws ObjectClassNotAllowedException
36
     */
37 View Code Duplication
    public function insert(Entity $object)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
38
    {
39
        if (!$this->getSupport($object)) {
40
            throw new ObjectClassNotAllowedException();
41
42
        }
43
        $object->setCreatedAt(new DateTime());
44
        $this->entityManager->persist($object);
45
        $this->entityManager->flush();
46
47
        return $object;
48
    }
49
50
    /**
51
     * @param Entity $object
52
     *
53
     * @return Entity|boolean
54
     *
55
     * @throws ObjectClassNotAllowedException
56
     */
57 View Code Duplication
    public function update(Entity $object)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
58
    {
59
        if (!$this->getSupport($object)) {
60
            throw new ObjectClassNotAllowedException();
61
        }
62
        $object->setUpdatedAt(new DateTime());
63
        $this->entityManager->flush();
64
65
        return $object;
66
    }
67
68
    /**
69
     * Finds an entity by its primary key / identifier.
70
     *
71
     * @param mixed $id The identifier.
72
     * @param int|null $lockMode One of the \Doctrine\DBAL\LockMode::* constants
73
     *                              or NULL if no specific lock mode should be used
74
     *                              during the search.
75
     * @param int|null $lockVersion The lock version.
76
     *
77
     * @return object|null The entity instance or NULL if the entity can not be found.
78
     */
79
    public function find($id, $lockMode = null, $lockVersion = null)
80
    {
81
        return $this->repository->find($id, $lockMode, $lockVersion);
82
    }
83
84
    /**
85
     * Finds a single entity by a set of criteria.
86
     *
87
     * @param array $criteria
88
     * @param array|null $orderBy
89
     *
90
     * @return object|null The entity instance or NULL if the entity can not be found.
91
     */
92
    public function findOneBy(array $criteria, array $orderBy = null)
93
    {
94
        return $this->repository->findOneBy($criteria, $orderBy);
95
    }
96
97
    /**
98
     * Finds entities by a set of criteria.
99
     *
100
     * @param array $criteria
101
     * @param array|null $orderBy
102
     * @param int|null $limit
103
     * @param int|null $offset
104
     *
105
     * @return array The objects.
106
     */
107
    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
108
    {
109
        return $this->repository->findBy($criteria, $orderBy, $limit, $offset);
110
    }
111
112
    /**
113
     * Finds all entities in the repository.
114
     *
115
     * @return array The entities.
116
     */
117
    public function findAll()
118
    {
119
        return $this->repository->findAll();
120
    }
121
122
    /**
123
     * @return EntityRepository
124
     */
125
    public function getRepository()
126
    {
127
        return $this->repository;
128
    }
129
130
131
    public function getPutOptionResolver(OptionsResolver $resolver = null)
132
    {
133
        $resolver = $this->getPostOptionResolver($resolver);
134
        $resolver->setRequired(
135
            [
136
                'id',
137
            ]
138
        );
139
140
        return $resolver;
141
    }
142
}
143