mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-20 22:53:49 +00:00
113 lines
2.6 KiB
PHP
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;
|
|
}
|
|
}
|