Skip to content

Commit f36c3f5

Browse files
committed
[ObjectMapper] Add ObjectMapperAwareInterface to set the owning object
1 parent e0c2c21 commit f36c3f5

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

object_mapper.rst

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,50 @@ Using it in practice::
589589
// $employeeDto->manager->name === 'Alice'
590590
// $employeeDto->manager->manager === $employeeDto
591591

592+
Decorating the ObjectMapper
593+
---------------------------
594+
595+
The ``object_mapper`` service can be decorated to add custom logic and state
596+
management around the mapping process.
597+
598+
One can use the
599+
:class:`Symfony\\Component\\ObjectMapper\\ObjectMapperAwareInterface`. When a
600+
decorator is applied, it can pass itself to the decorated service (if it implements
601+
this interface). This allows the underlying services, like the ``ObjectMapper``,
602+
to use the top-level decorator's ``map()`` method for recursive mapping, ensuring
603+
that the decorator's state is consistently used.
604+
605+
Here is an example of a decorator that preserves object identity across calls.
606+
It uses the ``AsDecorator`` attribute to automatically configure itself as a
607+
decorator for the ``object_mapper`` service:
608+
609+
.. code-block:: php
610+
611+
// src/ObjectMapper/StatefulObjectMapper.php
612+
namespace App\ObjectMapper;
613+
614+
use Symfony\Component\DependencyInjection\Attribute\AsDecorator;
615+
use Symfony\Component\ObjectMapper\ObjectMapperAwareInterface;
616+
use Symfony\Component\ObjectMapper\ObjectMapperInterface;
617+
618+
#[AsDecorator(decorates: ObjectMapperInterface::class)]
619+
final class StatefulObjectMapper implements ObjectMapperInterface
620+
{
621+
public function __construct(private ObjectMapperInterface $decorated)
622+
{
623+
// Pass this decorator to the decorated service if it's aware
624+
if ($this->decorated instanceof ObjectMapperAwareInterface) {
625+
$this->decorated = $this->decorated->withObjectMapper($this);
626+
}
627+
}
628+
629+
public function map(object $source, object|string|null $target = null): object
630+
{
631+
return $this->decorated->map($source, $target);
632+
}
633+
}
634+
635+
592636
.. _objectmapper-custom-mapping-logic:
593637

594638
Custom Mapping Logic

0 commit comments

Comments
 (0)