Files
chill-bundles/src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php
2023-02-06 17:47:54 +01:00

113 lines
2.6 KiB
PHP

<?php
/**
* Chill is a software for social workers.
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Form\DataTransformer;
use Closure;
use Doctrine\Persistence\ObjectRepository;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use function call_user_func;
/**
* @template T
*/
class IdToEntityDataTransformer implements DataTransformerInterface
{
private Closure $getId;
private bool $multiple = false;
private ObjectRepository $repository;
/**
* @param Closure $getId
*/
public function __construct(ObjectRepository $repository, bool $multiple = false, ?callable $getId = null)
{
$this->repository = $repository;
$this->multiple = $multiple;
$this->getId = $getId ?? static function (object $o) {
return $o->getId();
};
}
/**
* @param string $value
*
* @return array|object[]|T[]|T|object
*/
public function reverseTransform($value)
{
if ($this->multiple) {
if (null === $value | '' === $value) {
return [];
}
return array_map(
fn (string $id): ?object => $this->repository->findOneBy(['id' => (int) $id]),
explode(',', $value)
);
}
if (null === $value | '' === $value) {
return null;
}
$object = $this->repository->findOneBy(['id' => (int) $value]);
if (null === $object) {
throw new TransformationFailedException('could not find any object by object id');
}
return $object;
}
/**
* @param object|T|object[]|T[] $value
*/
public function transform($value): string
{
if ($this->multiple) {
$ids = [];
foreach ($value as $v) {
$ids[] = $id = call_user_func($this->getId, $v);
if (null === $id) {
throw new TransformationFailedException('id is null');
}
}
return implode(',', $ids);
}
if (null === $value) {
return '';
}
$id = call_user_func($this->getId, $value);
if (null === $id) {
throw new TransformationFailedException('id is null');
}
return (string) $id;
}
}