symfony 覆盖供应商中标注为“最终”的类

bmp9r5qi  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(163)

我想覆盖JMS/序列化器包中的一个类。不幸的是,这个类被标记为“final”,我不能覆盖它。请问,解决这个问题的最好方法是什么?我在symfony5.4上
下面是我想要重写的类:

<?php

declare(strict_types=1);

namespace JMS\Serializer\Handler;

use JMS\Serializer\GraphNavigatorInterface;
use JMS\Serializer\Visitor\SerializationVisitorInterface;
use JMS\Serializer\XmlSerializationVisitor;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface as TranslatorContract;

use function get_class;

 final class FormErrorHandler implements SubscribingHandlerInterface
{
    /**
     * @var TranslatorInterface|null
     */
    private $translator;

    /**
     * @var string
     */
    private $translationDomain;
ssgvzors

ssgvzors1#

简短的回答是,只要包作者没有提供用自定义实现替换最终类的功能,就不能覆盖最终类。
通过查看软件包的源代码,您可以做到这一点。SerializeBuilder构造函数类似于:

public function __construct(?HandlerRegistryInterface $handlerRegistry = null, ?EventDispatcherInterface $eventDispatcher = null)

这显然意味着您可以添加自定义处理程序。
并且由于文档的缘故,您可以轻松地实现自己的处理程序。

$builder
    ->configureHandlers(function(JMS\Serializer\Handler\HandlerRegistry $registry) {
        $registry->registerSubscribingHandler(new MyHandler());
    })
;
gcuhipw9

gcuhipw92#

我最终找到了一个解决方案。我重写了FOS/SerializerbUndle中的FormErrorHandler类,然后重写了JMS中的formErrorHandlere类,我在FOS/FormErrorHandler的重载中调用了这个类。它工作得很好

相关问题