1 | <?php |
||||
2 | |||||
3 | declare(strict_types=1); |
||||
4 | |||||
5 | namespace JMS\Serializer\EventDispatcher\Subscriber; |
||||
6 | |||||
7 | use Doctrine\Common\Persistence\Proxy as LegacyProxy; |
||||
0 ignored issues
–
show
|
|||||
8 | use Doctrine\ODM\MongoDB\PersistentCollection as MongoDBPersistentCollection; |
||||
0 ignored issues
–
show
The type
Doctrine\ODM\MongoDB\PersistentCollection was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths
Loading history...
|
|||||
9 | use Doctrine\ODM\PHPCR\PersistentCollection as PHPCRPersistentCollection; |
||||
10 | use Doctrine\ORM\PersistentCollection; |
||||
11 | use Doctrine\Persistence\Proxy; |
||||
12 | use JMS\Serializer\EventDispatcher\EventDispatcherInterface; |
||||
13 | use JMS\Serializer\EventDispatcher\EventSubscriberInterface; |
||||
14 | use JMS\Serializer\EventDispatcher\PreSerializeEvent; |
||||
15 | use ProxyManager\Proxy\LazyLoadingInterface; |
||||
16 | |||||
17 | final class DoctrineProxySubscriber implements EventSubscriberInterface |
||||
18 | { |
||||
19 | /** |
||||
20 | * @var bool |
||||
21 | */ |
||||
22 | private $skipVirtualTypeInit; |
||||
23 | |||||
24 | /** |
||||
25 | * @var bool |
||||
26 | */ |
||||
27 | private $initializeExcluded; |
||||
28 | 338 | ||||
29 | public function __construct(bool $skipVirtualTypeInit = true, bool $initializeExcluded = false) |
||||
30 | 338 | { |
|||
31 | 338 | $this->skipVirtualTypeInit = $skipVirtualTypeInit; |
|||
32 | 338 | $this->initializeExcluded = $initializeExcluded; |
|||
33 | } |
||||
34 | 14 | ||||
35 | public function onPreSerialize(PreSerializeEvent $event): void |
||||
36 | 14 | { |
|||
37 | 14 | $object = $event->getObject(); |
|||
38 | $type = $event->getType(); |
||||
39 | |||||
40 | // If the set type name is not an actual class, but a faked type for which a custom handler exists, we do not |
||||
41 | // modify it with this subscriber. Also, we forgo autoloading here as an instance of this type is already created, |
||||
42 | 14 | // so it must be loaded if its a real class. |
|||
43 | $virtualType = !class_exists($type['name'], false); |
||||
44 | 14 | ||||
45 | 14 | if ( |
|||
46 | 14 | $object instanceof PersistentCollection |
|||
47 | || $object instanceof MongoDBPersistentCollection |
||||
48 | 1 | || $object instanceof PHPCRPersistentCollection |
|||
49 | 1 | ) { |
|||
50 | if (!$virtualType) { |
||||
51 | $event->setType('ArrayCollection'); |
||||
52 | 1 | } |
|||
53 | |||||
54 | return; |
||||
55 | 14 | } |
|||
56 | 14 | ||||
57 | if ( |
||||
58 | 3 | ($this->skipVirtualTypeInit && $virtualType) || |
|||
59 | (!$object instanceof Proxy && !$object instanceof LazyLoadingInterface) |
||||
60 | ) { |
||||
61 | return; |
||||
62 | 11 | } |
|||
63 | 11 | ||||
64 | 11 | // do not initialize the proxy if is going to be excluded by-class by some exclusion strategy |
|||
65 | 11 | if (false === $this->initializeExcluded && !$virtualType) { |
|||
66 | 11 | $context = $event->getContext(); |
|||
67 | 2 | $exclusionStrategy = $context->getExclusionStrategy(); |
|||
68 | $metadata = $context->getMetadataFactory()->getMetadataForClass(get_parent_class($object)); |
||||
69 | if (null !== $metadata && null !== $exclusionStrategy && $exclusionStrategy->shouldSkipClass($metadata, $context)) { |
||||
0 ignored issues
–
show
It seems like
$metadata can also be of type Metadata\ClassHierarchyMetadata ; however, parameter $metadata of JMS\Serializer\Exclusion...face::shouldSkipClass() does only seem to accept JMS\Serializer\Metadata\ClassMetadata , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
70 | return; |
||||
71 | 10 | } |
|||
72 | } |
||||
73 | 10 | ||||
74 | 9 | if ($object instanceof LazyLoadingInterface) { |
|||
75 | $object->initializeProxy(); |
||||
76 | 10 | } else { |
|||
77 | $object->__load(); |
||||
78 | 8 | } |
|||
79 | |||||
80 | 8 | if (!$virtualType) { |
|||
81 | $event->setType(get_parent_class($object), $type['params']); |
||||
82 | 8 | } |
|||
83 | 1 | } |
|||
84 | |||||
85 | public function onPreSerializeTypedProxy(PreSerializeEvent $event, string $eventName, string $class, string $format, EventDispatcherInterface $dispatcher): void |
||||
86 | 7 | { |
|||
87 | 7 | $type = $event->getType(); |
|||
88 | 7 | // is a virtual type? then there is no need to change the event name |
|||
89 | if (!class_exists($type['name'], false)) { |
||||
90 | return; |
||||
91 | 7 | } |
|||
92 | 7 | ||||
93 | 7 | $object = $event->getObject(); |
|||
94 | 7 | if ($object instanceof Proxy) { |
|||
95 | $parentClassName = get_parent_class($object); |
||||
96 | |||||
97 | 7 | // check if this is already a re-dispatch |
|||
98 | 7 | if (strtolower($class) !== strtolower($parentClassName)) { |
|||
99 | $event->stopPropagation(); |
||||
100 | $newEvent = new PreSerializeEvent($event->getContext(), $object, ['name' => $parentClassName, 'params' => $type['params']]); |
||||
101 | 7 | $dispatcher->dispatch($eventName, $parentClassName, $format, $newEvent); |
|||
102 | |||||
103 | 338 | // update the type in case some listener changed it |
|||
104 | $newType = $newEvent->getType(); |
||||
105 | $event->setType($newType['name'], $newType['params']); |
||||
106 | 338 | } |
|||
107 | } |
||||
108 | } |
||||
109 | |||||
110 | /** |
||||
111 | * {@inheritdoc} |
||||
112 | */ |
||||
113 | public static function getSubscribedEvents() |
||||
114 | { |
||||
115 | return [ |
||||
116 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerializeTypedProxy', 'interface' => Proxy::class], |
||||
117 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerializeTypedProxy', 'interface' => LegacyProxy::class], |
||||
118 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => PersistentCollection::class], |
||||
119 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => MongoDBPersistentCollection::class], |
||||
120 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => PHPCRPersistentCollection::class], |
||||
121 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => Proxy::class], |
||||
122 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => LegacyProxy::class], |
||||
123 | ['event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize', 'interface' => LazyLoadingInterface::class], |
||||
124 | ]; |
||||
125 | } |
||||
126 | } |
||||
127 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths