From 0278dae68d840ee96fbf9141f97c335fc0e4ff65 Mon Sep 17 00:00:00 2001 From: Jordi Date: Sat, 15 Aug 2020 17:55:27 +0200 Subject: [PATCH] new iteration of type hints --- src/Form/ChoiceList/ModelChoiceLoader.php | 30 +++++------------ .../ArrayToModelTransformer.php | 26 +++++++++------ .../ModelToIdPropertyTransformer.php | 30 ++++++++++------- .../DataTransformer/ModelToIdTransformer.php | 22 +++++++++---- .../ModelsToArrayTransformer.php | 33 ++++++++++++------- .../EventListener/MergeCollectionListener.php | 3 ++ src/Form/Type/AclMatrixType.php | 3 ++ src/Form/Type/AdminType.php | 3 ++ src/Form/Type/ChoiceFieldMaskType.php | 3 ++ src/Form/Type/Filter/ChoiceType.php | 3 ++ src/Form/Type/Filter/DateRangeType.php | 3 ++ src/Form/Type/Filter/DateTimeRangeType.php | 3 ++ src/Form/Type/Filter/DateTimeType.php | 3 ++ src/Form/Type/Filter/DateType.php | 3 ++ src/Form/Type/Filter/DefaultType.php | 3 ++ src/Form/Type/Filter/NumberType.php | 3 ++ src/Form/Type/ModelAutocompleteType.php | 6 ++++ src/Form/Type/ModelHiddenType.php | 3 ++ src/Form/Type/ModelListType.php | 6 ++++ src/Form/Type/ModelReferenceType.php | 3 ++ src/Form/Type/ModelType.php | 11 +++++-- .../Form/ChoiceList/ModelChoiceLoaderTest.php | 5 +++ .../ModelToIdTransformerTest.php | 12 +++---- 23 files changed, 150 insertions(+), 70 deletions(-) diff --git a/src/Form/ChoiceList/ModelChoiceLoader.php b/src/Form/ChoiceList/ModelChoiceLoader.php index 80895d776cb..04fc1c42129 100644 --- a/src/Form/ChoiceList/ModelChoiceLoader.php +++ b/src/Form/ChoiceList/ModelChoiceLoader.php @@ -20,7 +20,6 @@ use Symfony\Component\Form\ChoiceList\ChoiceListInterface; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; use Symfony\Component\Form\Exception\RuntimeException; -use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; /** @@ -28,18 +27,13 @@ */ final class ModelChoiceLoader implements ChoiceLoaderInterface { - /** - * @var string[] - */ - public $identifier; - /** * @var ModelManagerInterface */ private $modelManager; /** - * @var string + * @var class-string|null */ private $class; @@ -49,7 +43,7 @@ final class ModelChoiceLoader implements ChoiceLoaderInterface private $property; /** - * @var mixed + * @var object|null */ private $query; @@ -69,25 +63,23 @@ final class ModelChoiceLoader implements ChoiceLoaderInterface private $choiceList; /** - * @param mixed $query - * @param object[] $choices + * @param class-string|null $class + * @param object[] $choices */ public function __construct( ModelManagerInterface $modelManager, - string $class, + PropertyAccessorInterface $propertyAccessor, + ?string $class = null, ?string $property = null, - $query = null, - array $choices = [], - ?PropertyAccessorInterface $propertyAccessor = null + ?object $query = null, + array $choices = [] ) { $this->modelManager = $modelManager; $this->class = $class; $this->property = $property; $this->query = $query; $this->choices = $choices; - $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); - - $this->identifier = $this->modelManager->getIdentifierFieldNames($this->class); + $this->propertyAccessor = $propertyAccessor; } public function loadChoiceList($value = null): ChoiceListInterface @@ -146,8 +138,6 @@ public function loadChoiceList($value = null): ChoiceListInterface } /** - * @param string[] $values - * * @return object[] */ public function loadChoicesForValues(array $values, $value = null): array @@ -157,8 +147,6 @@ public function loadChoicesForValues(array $values, $value = null): array /** * @param object[] $choices - * - * @return string[] */ public function loadValuesForChoices(array $choices, $value = null): array { diff --git a/src/Form/DataTransformer/ArrayToModelTransformer.php b/src/Form/DataTransformer/ArrayToModelTransformer.php index 7aea05fecb5..01e1b1b0946 100644 --- a/src/Form/DataTransformer/ArrayToModelTransformer.php +++ b/src/Form/DataTransformer/ArrayToModelTransformer.php @@ -18,6 +18,8 @@ /** * @author Thomas Rabaix + * + * @template T of object */ final class ArrayToModelTransformer implements DataTransformerInterface { @@ -27,31 +29,35 @@ final class ArrayToModelTransformer implements DataTransformerInterface private $modelManager; /** - * @var string + * @var class-string */ private $className; + /** + * @param class-string $className + */ public function __construct(ModelManagerInterface $modelManager, string $className) { $this->modelManager = $modelManager; $this->className = $className; } - public function reverseTransform($array) + /** + * @return T + */ + public function reverseTransform($value): object { // when the object is created the form return an array - // one the object is persisted, the edit $array is the user instance - if ($array instanceof $this->className) { - return $array; + // one the object is persisted, the edit $value is the user instance + if ($value instanceof $this->className) { + return $value; } - $instance = new $this->className(); - - if (!\is_array($array)) { - return $instance; + if (!\is_array($value)) { + return new $this->className(); } - return $this->modelManager->modelReverseTransform($this->className, $array); + return $this->modelManager->modelReverseTransform($this->className, $value); } public function transform($value) diff --git a/src/Form/DataTransformer/ModelToIdPropertyTransformer.php b/src/Form/DataTransformer/ModelToIdPropertyTransformer.php index 44fcbd211bf..317ca44efe6 100644 --- a/src/Form/DataTransformer/ModelToIdPropertyTransformer.php +++ b/src/Form/DataTransformer/ModelToIdPropertyTransformer.php @@ -13,6 +13,7 @@ namespace Sonata\AdminBundle\Form\DataTransformer; +use Doctrine\Common\Collections\Collection; use Doctrine\Common\Util\ClassUtils; use Sonata\AdminBundle\Model\ModelManagerInterface; use Symfony\Component\Form\DataTransformerInterface; @@ -21,6 +22,8 @@ * Transform object to ID and property label. * * @author Andrej Hudec + * + * @template T of object */ final class ModelToIdPropertyTransformer implements DataTransformerInterface { @@ -30,7 +33,7 @@ final class ModelToIdPropertyTransformer implements DataTransformerInterface private $modelManager; /** - * @var string + * @var class-string */ private $className; @@ -49,6 +52,9 @@ final class ModelToIdPropertyTransformer implements DataTransformerInterface */ private $toStringCallback; + /** + * @param class-string $className + */ public function __construct( ModelManagerInterface $modelManager, string $className, @@ -65,6 +71,8 @@ public function __construct( /** * @throws \UnexpectedValueException + * + * @return Collection|T|null */ public function reverseTransform($value) { @@ -100,25 +108,25 @@ public function reverseTransform($value) /** * @throws \InvalidArgumentException */ - public function transform($entityOrCollection) + public function transform($value) { $result = []; - if (!$entityOrCollection) { + if (!$value) { return $result; } if ($this->multiple) { - $isArray = \is_array($entityOrCollection); - if (!$isArray && substr(\get_class($entityOrCollection), -1 * \strlen($this->className)) === $this->className) { + $isArray = \is_array($value); + if (!$isArray && substr(\get_class($value), -1 * \strlen($this->className)) === $this->className) { throw new \InvalidArgumentException( 'A multiple selection must be passed a collection not a single value.' .' Make sure that form option "multiple=false" is set for many-to-one relation and "multiple=true"' .' is set for many-to-many or one-to-many relations.' ); } - if ($isArray || ($entityOrCollection instanceof \ArrayAccess)) { - $collection = $entityOrCollection; + if ($isArray || ($value instanceof \ArrayAccess)) { + $collection = $value; } else { throw new \InvalidArgumentException( 'A multiple selection must be passed a collection not a single value.' @@ -127,16 +135,16 @@ public function transform($entityOrCollection) ); } } else { - if (substr(\get_class($entityOrCollection), -1 * \strlen($this->className)) === $this->className) { - $collection = [$entityOrCollection]; - } elseif ($entityOrCollection instanceof \ArrayAccess) { + if (substr(\get_class($value), -1 * \strlen($this->className)) === $this->className) { + $collection = [$value]; + } elseif ($value instanceof \ArrayAccess) { throw new \InvalidArgumentException( 'A single selection must be passed a single value not a collection.' .' Make sure that form option "multiple=false" is set for many-to-one relation and "multiple=true"' .' is set for many-to-many or one-to-many relations.' ); } else { - $collection = [$entityOrCollection]; + $collection = [$value]; } } diff --git a/src/Form/DataTransformer/ModelToIdTransformer.php b/src/Form/DataTransformer/ModelToIdTransformer.php index b3c29ffb8d7..367e569a31e 100644 --- a/src/Form/DataTransformer/ModelToIdTransformer.php +++ b/src/Form/DataTransformer/ModelToIdTransformer.php @@ -18,6 +18,8 @@ /** * @author Thomas Rabaix + * + * @template T of object */ final class ModelToIdTransformer implements DataTransformerInterface { @@ -27,31 +29,37 @@ final class ModelToIdTransformer implements DataTransformerInterface private $modelManager; /** - * @var string + * @var class-string */ private $className; + /** + * @param class-string $className + */ public function __construct(ModelManagerInterface $modelManager, string $className) { $this->modelManager = $modelManager; $this->className = $className; } - public function reverseTransform($newId) + /** + * @return T|null + */ + public function reverseTransform($value): ?object { - if (empty($newId) && !\in_array($newId, ['0', 0], true)) { + if (empty($value) && !\in_array($value, ['0', 0], true)) { return null; } - return $this->modelManager->find($this->className, $newId); + return $this->modelManager->find($this->className, $value); } - public function transform($model) + public function transform($value): ?string { - if (empty($model)) { + if (empty($value)) { return null; } - return $this->modelManager->getNormalizedIdentifier($model); + return $this->modelManager->getNormalizedIdentifier($value); } } diff --git a/src/Form/DataTransformer/ModelsToArrayTransformer.php b/src/Form/DataTransformer/ModelsToArrayTransformer.php index bc2fed1515f..b5a95558d3e 100644 --- a/src/Form/DataTransformer/ModelsToArrayTransformer.php +++ b/src/Form/DataTransformer/ModelsToArrayTransformer.php @@ -13,6 +13,7 @@ namespace Sonata\AdminBundle\Form\DataTransformer; +use Doctrine\Common\Collections\Collection; use Doctrine\Common\Util\ClassUtils; use Sonata\AdminBundle\Model\ModelManagerInterface; use Sonata\Doctrine\Adapter\AdapterInterface; @@ -22,6 +23,8 @@ /** * @author Thomas Rabaix + * + * @template T of object */ final class ModelsToArrayTransformer implements DataTransformerInterface { @@ -31,27 +34,33 @@ final class ModelsToArrayTransformer implements DataTransformerInterface private $modelManager; /** - * @var string + * @var class-string */ private $class; + /** + * @param class-string $class + */ public function __construct(ModelManagerInterface $modelManager, string $class) { $this->modelManager = $modelManager; $this->class = $class; } - public function transform($collection) + /** + * @param T[]|null $value + * + * @return string[] + */ + public function transform($value): array { - if (null === $collection) { + if (null === $value) { return []; } $array = []; - foreach ($collection as $key => $model) { - $id = implode(AdapterInterface::ID_SEPARATOR, $this->getIdentifierValues($model)); - - $array[] = $id; + foreach ($value as $model) { + $array[] = implode(AdapterInterface::ID_SEPARATOR, $this->getIdentifierValues($model)); } return $array; @@ -59,18 +68,20 @@ public function transform($collection) /** * @throws UnexpectedTypeException + * + * @return Collection */ - public function reverseTransform($keys) + public function reverseTransform($value) { - if (!\is_array($keys)) { - throw new UnexpectedTypeException($keys, 'array'); + if (!\is_array($value)) { + throw new UnexpectedTypeException($value, 'array'); } $collection = $this->modelManager->getModelCollectionInstance($this->class); $notFound = []; // optimize this into a SELECT WHERE IN query - foreach ($keys as $key) { + foreach ($value as $key) { if ($model = $this->modelManager->find($this->class, $key)) { $collection[] = $model; } else { diff --git a/src/Form/EventListener/MergeCollectionListener.php b/src/Form/EventListener/MergeCollectionListener.php index d8de7f15c21..b9e8ab4ba47 100644 --- a/src/Form/EventListener/MergeCollectionListener.php +++ b/src/Form/EventListener/MergeCollectionListener.php @@ -33,6 +33,9 @@ public function __construct(ModelManagerInterface $modelManager) $this->modelManager = $modelManager; } + /** + * @return array + */ public static function getSubscribedEvents(): array { return [ diff --git a/src/Form/Type/AclMatrixType.php b/src/Form/Type/AclMatrixType.php index abcb7eea695..e51fc5c5eef 100644 --- a/src/Form/Type/AclMatrixType.php +++ b/src/Form/Type/AclMatrixType.php @@ -28,6 +28,9 @@ */ final class AclMatrixType extends AbstractType { + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $aclValueType = $options['acl_value'] instanceof UserInterface ? 'user' : 'role'; diff --git a/src/Form/Type/AdminType.php b/src/Form/Type/AdminType.php index 22af8b124f5..d983b43e17e 100644 --- a/src/Form/Type/AdminType.php +++ b/src/Form/Type/AdminType.php @@ -99,6 +99,9 @@ static function (array $associationMapping): string { $builder->addModelTransformer(new ArrayToModelTransformer($admin->getModelManager(), $admin->getClass())); } + /** + * @param array $options + */ public function buildView(FormView $view, FormInterface $form, array $options): void { $view->vars['btn_add'] = $options['btn_add']; diff --git a/src/Form/Type/ChoiceFieldMaskType.php b/src/Form/Type/ChoiceFieldMaskType.php index aa9be418e1c..14b2dd54810 100644 --- a/src/Form/Type/ChoiceFieldMaskType.php +++ b/src/Form/Type/ChoiceFieldMaskType.php @@ -24,6 +24,9 @@ */ final class ChoiceFieldMaskType extends AbstractType { + /** + * @param array $options + */ public function buildView(FormView $view, FormInterface $form, array $options): void { $sanitizedMap = []; diff --git a/src/Form/Type/Filter/ChoiceType.php b/src/Form/Type/Filter/ChoiceType.php index 8207ef04686..1359b90eb7a 100644 --- a/src/Form/Type/Filter/ChoiceType.php +++ b/src/Form/Type/Filter/ChoiceType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_choice'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/Filter/DateRangeType.php b/src/Form/Type/Filter/DateRangeType.php index bb56920850a..e7365911a16 100644 --- a/src/Form/Type/Filter/DateRangeType.php +++ b/src/Form/Type/Filter/DateRangeType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_date_range'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/Filter/DateTimeRangeType.php b/src/Form/Type/Filter/DateTimeRangeType.php index 583d5e97a3d..b22d95a89e1 100644 --- a/src/Form/Type/Filter/DateTimeRangeType.php +++ b/src/Form/Type/Filter/DateTimeRangeType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_datetime_range'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/Filter/DateTimeType.php b/src/Form/Type/Filter/DateTimeType.php index a8ff41335d5..80a4eb3aaa6 100644 --- a/src/Form/Type/Filter/DateTimeType.php +++ b/src/Form/Type/Filter/DateTimeType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_datetime'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/Filter/DateType.php b/src/Form/Type/Filter/DateType.php index d1eef2ce1d6..f9aff6792ae 100644 --- a/src/Form/Type/Filter/DateType.php +++ b/src/Form/Type/Filter/DateType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_date'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/Filter/DefaultType.php b/src/Form/Type/Filter/DefaultType.php index 1a5831eaed2..cc67be466f4 100644 --- a/src/Form/Type/Filter/DefaultType.php +++ b/src/Form/Type/Filter/DefaultType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_default'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/Filter/NumberType.php b/src/Form/Type/Filter/NumberType.php index 4c8435e085c..61253f3f642 100644 --- a/src/Form/Type/Filter/NumberType.php +++ b/src/Form/Type/Filter/NumberType.php @@ -29,6 +29,9 @@ public function getBlockPrefix(): string return 'sonata_type_filter_number'; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/ModelAutocompleteType.php b/src/Form/Type/ModelAutocompleteType.php index 7feaeff585e..eb4a5bb6fe1 100644 --- a/src/Form/Type/ModelAutocompleteType.php +++ b/src/Form/Type/ModelAutocompleteType.php @@ -31,6 +31,9 @@ */ final class ModelAutocompleteType extends AbstractType { + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->addViewTransformer(new ModelToIdPropertyTransformer($options['model_manager'], $options['class'], $options['property'], $options['multiple'], $options['to_string_callback']), true); @@ -54,6 +57,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void } } + /** + * @param array $options + */ public function buildView(FormView $view, FormInterface $form, array $options): void { foreach ([ diff --git a/src/Form/Type/ModelHiddenType.php b/src/Form/Type/ModelHiddenType.php index 770b8554d04..9b5a4f59f74 100644 --- a/src/Form/Type/ModelHiddenType.php +++ b/src/Form/Type/ModelHiddenType.php @@ -26,6 +26,9 @@ */ final class ModelHiddenType extends AbstractType { + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder diff --git a/src/Form/Type/ModelListType.php b/src/Form/Type/ModelListType.php index 093ba745821..36976474ed1 100644 --- a/src/Form/Type/ModelListType.php +++ b/src/Form/Type/ModelListType.php @@ -43,6 +43,9 @@ */ final class ModelListType extends AbstractType { + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder @@ -50,6 +53,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ->addViewTransformer(new ModelToIdTransformer($options['model_manager'], $options['class'])); } + /** + * @param array $options + */ public function buildView(FormView $view, FormInterface $form, array $options): void { if (isset($view->vars['sonata_admin'])) { diff --git a/src/Form/Type/ModelReferenceType.php b/src/Form/Type/ModelReferenceType.php index 35be2f2fcd1..8a471d96387 100644 --- a/src/Form/Type/ModelReferenceType.php +++ b/src/Form/Type/ModelReferenceType.php @@ -24,6 +24,9 @@ */ final class ModelReferenceType extends AbstractType { + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->addModelTransformer(new ModelToIdTransformer($options['model_manager'], $options['class'])); diff --git a/src/Form/Type/ModelType.php b/src/Form/Type/ModelType.php index d1ac42c6a99..cf5095d9e02 100644 --- a/src/Form/Type/ModelType.php +++ b/src/Form/Type/ModelType.php @@ -43,6 +43,9 @@ public function __construct(PropertyAccessorInterface $propertyAccessor) $this->propertyAccessor = $propertyAccessor; } + /** + * @param array $options + */ public function buildForm(FormBuilderInterface $builder, array $options): void { if ($options['multiple']) { @@ -61,6 +64,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void } } + /** + * @param array $options + */ public function buildView(FormView $view, FormInterface $form, array $options): void { $view->vars['btn_add'] = $options['btn_add']; @@ -72,19 +78,18 @@ public function buildView(FormView $view, FormInterface $form, array $options): public function configureOptions(OptionsResolver $resolver): void { $options = []; - $propertyAccessor = $this->propertyAccessor; - $options['choice_loader'] = static function (Options $options, $previousValue) use ($propertyAccessor) { + $options['choice_loader'] = function (Options $options, $previousValue) { if ($previousValue && \count($choices = $previousValue->getChoices())) { return $choices; } return new ModelChoiceLoader( $options['model_manager'], + $this->propertyAccessor, $options['class'], $options['property'], $options['query'], $options['choices'], - $propertyAccessor ); }; diff --git a/tests/Form/ChoiceList/ModelChoiceLoaderTest.php b/tests/Form/ChoiceList/ModelChoiceLoaderTest.php index 7dd62a644da..18d9fbdd198 100644 --- a/tests/Form/ChoiceList/ModelChoiceLoaderTest.php +++ b/tests/Form/ChoiceList/ModelChoiceLoaderTest.php @@ -17,14 +17,18 @@ use Sonata\AdminBundle\Form\ChoiceList\ModelChoiceLoader; use Sonata\AdminBundle\Model\ModelManagerInterface; use Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Foo; +use Symfony\Component\PropertyAccess\PropertyAccess; class ModelChoiceLoaderTest extends TestCase { private $modelManager; + private $propertyAccessor; + protected function setUp(): void { $this->modelManager = $this->getMockForAbstractClass(ModelManagerInterface::class); + $this->propertyAccessor = PropertyAccess::createPropertyAccessor(); } public function testLoadFromEntityWithSamePropertyValues(): void @@ -49,6 +53,7 @@ public function testLoadFromEntityWithSamePropertyValues(): void $modelChoiceLoader = new ModelChoiceLoader( $this->modelManager, + $this->propertyAccessor, \Sonata\AdminBundle\Tests\Fixtures\Entity\Foo::class, 'baz' ); diff --git a/tests/Form/DataTransformer/ModelToIdTransformerTest.php b/tests/Form/DataTransformer/ModelToIdTransformerTest.php index 6ed190c5e60..22271e0792c 100644 --- a/tests/Form/DataTransformer/ModelToIdTransformerTest.php +++ b/tests/Form/DataTransformer/ModelToIdTransformerTest.php @@ -33,15 +33,13 @@ public function testReverseTransformWhenPassing0AsId(): void $this->modelManager ->expects($this->exactly(2)) ->method('find') - ->willReturn(true); - - $this->assertFalse(\in_array(false, ['0', 0], true)); + ->willReturn(new \stdClass()); // we pass 0 as integer - $this->assertTrue($transformer->reverseTransform(0)); + $this->assertNotNull($transformer->reverseTransform(0)); // we pass 0 as string - $this->assertTrue($transformer->reverseTransform('0')); + $this->assertNotNull($transformer->reverseTransform('0')); // we pass null must return null $this->assertNull($transformer->reverseTransform(null)); @@ -76,7 +74,7 @@ public function testTransform(): void { $this->modelManager->expects($this->once()) ->method('getNormalizedIdentifier') - ->willReturn(123); + ->willReturn('123'); $transformer = new ModelToIdTransformer($this->modelManager, 'TEST'); @@ -85,6 +83,6 @@ public function testTransform(): void $this->assertNull($transformer->transform(0)); $this->assertNull($transformer->transform('0')); - $this->assertSame(123, $transformer->transform(new \stdClass())); + $this->assertSame('123', $transformer->transform(new \stdClass())); } }