Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Different return type (NormalizerInterface vs NormalizableInterface) #49067

Open
VencaKrecl opened this issue Jan 22, 2023 · 0 comments
Open

Comments

@VencaKrecl
Copy link

VencaKrecl commented Jan 22, 2023

Symfony version(s) affected

6.2.3

Description

The CustomNormalizer calls NormalizableInterface in the normalize method but the return type is not the same. There are missing \ArrayObject|null, see

TypeError : App\HashMap\HashMap::normalize(): Return value must be of type array|string|int|float|bool, ArrayObject returned

How to reproduce

<?php

namespace App\HashMap;

use Symfony\Component\Serializer\Normalizer\DenormalizableInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizableInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

class HashMap implements NormalizableInterface, DenormalizableInterface
{
    private \ArrayObject $items;

    public function __construct(array $items = [])
    {
        $this->items = new \ArrayObject($items);
    }

    public function add(string $key, string $value): self {
        $this->items->offsetSet($key, $value);

        return $this;
    }

    public function has(string $key): bool {
        return $this->items->offsetExists($key);
    }

    public function remove(string $key): void {
        $this->items->offsetUnset($key);
    }

    public function denormalize(
        DenormalizerInterface       $denormalizer,
        float|int|bool|array|string $data,
        string                      $format = null,
        array                       $context = []
    ) {
        return new self();
    }

    public function normalize(
        NormalizerInterface $normalizer,
        string              $format = null,
        array               $context = []
    ): array|string|int|float|bool {
        return $this->items;
    }
}

Possible Solution

<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

/**
 * Defines the most basic interface a class must implement to be normalizable.
 *
 * If a normalizer is registered for the class and it doesn't implement
 * the Normalizable interfaces, the normalizer will be used instead.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface NormalizableInterface
{
    /**
     * Normalizes the object into an array of scalars|arrays.
     *
     * It is important to understand that the normalize() call should normalize
     * recursively all child objects of the implementor.
     *
     * @param NormalizerInterface $normalizer The normalizer is given so that you
     *                                        can use it to normalize objects contained within this object
     * @param string|null         $format     The format is optionally given to be able to normalize differently
     *                                        based on different output formats
     * @param array               $context    Options for normalizing this object
     */
    public function normalize(NormalizerInterface $normalizer, string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null;
}

Additional Context

No response

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants