Как я могу исправить устаревшего пользователя в Symfony 4?

Я получаю следующее сообщение об ошибке:

User Deprecated: передача параметров конфигурации непосредственно в конструктор устарела, начиная с Symfony 4.2, вместо этого используйте контекст по умолчанию.

Это код, который Symfony дает в качестве трассировки проблемы:

$serializer = new Serializer(array(new DateTimeNormalizer('d.m.Y'), new GetSetMethodNormalizer()), array('json' => new JsonEncoder()));

Но я не понимаю, как использовать контекст по умолчанию


person Community    schedule 21.12.2018    source источник


Ответы (3)


Вы должны использовать непосредственно услугу.

class DefaultController extends AbstractController
{
    public function index(SerializerInterface $serializer)
    {
        // keep reading for usage examples
    }
}

https://symfony.com/doc/current/serializer.html

person goto    schedule 21.12.2018

Согласно документации вы должны использовать его как это:

-$serializer = new Serializer(array(new DateTimeNormalizer('d.m.Y'), new GetSetMethodNormalizer()), array('json' => new JsonEncoder()));
-$serializer->serialize($myObject, 'json')

+$serializer = new Serializer(array(new DateTimeNormalizer(), new GetSetMethodNormalizer()), array('json' => new JsonEncoder()));
+$serializer->serialize($myObject, 'json', [DateTimeNormalizer::FORMAT_KEY => 'd.m.Y'])
person Dan F.    schedule 19.09.2019

Я проверил код, вызвавший устаревание (конструктор класса DateTimeNormalizer):

public function __construct($defaultContext = [], \DateTimeZone $timezone = null)
{
    $this->defaultContext = [
        self::FORMAT_KEY => \DateTime::RFC3339,
        self::TIMEZONE_KEY => null,
    ];

    if (!\is_array($defaultContext)) {
        @trigger_error('Passing configuration options directly to the constructor is deprecated since Symfony 4.2, use the default context instead.', E_USER_DEPRECATED);

        $defaultContext = [self::FORMAT_KEY => (string) $defaultContext];
        $defaultContext[self::TIMEZONE_KEY] = $timezone;
    }

    $this->defaultContext = array_merge($this->defaultContext, $defaultContext);
}

Таким образом, в основном все сводится к изменению параметров, переданных DateTimeNormalizer (в моем случае у меня был CompilerPass, который задавал параметр, но в приведенном ниже примере я оставлю его общим):

new DateTimeNormalizer('d.m.Y'); // old, causing the deprecation notice

// new and NOT causing the deprecation notice
new DateTimeNormalizer([
    DateTimeNormalizer::FORMAT_KEY => 'd.m.Y'
]);
person Tobias Xy    schedule 12.02.2020