Как расширить определенный файл стороннего пакета в приложении Symfony?

Итак, у меня есть этот веб-сайт, который использует ezPublish (который сам основан на Symfony 2.8).

Для простоты у меня есть один файл BinaryContent.php, который содержит класс BinaryContent, расположенный по адресу:

/vendor/ezsystems/ezpublish-kernel/eZ/Publish/Core/REST/Server/Controller, где / — корень проекта (который содержит папки app/, src/, web/ и т. д.).

Я намерен изменить BinaryContent.php, чтобы реализовать мою собственную логику в данном методе. Таким образом, я решил переопределить этот файл, расширив пакет.

Следовательно:

Я уже знаю, что это не так.

  • Я нашел в services.yml этого пакета, что этот класс зарегистрирован как сервис:
    ezpublish_rest.controller.binary_content:
        class: "%ezpublish_rest.controller.binary_content.class%"
        parent: ezpublish_rest.controller.base
        arguments:
            - "@ezpublish.fieldType.ezimage.variation_service"

вместе с

parameters:
    ezpublish_rest.controller.binary_content.class: eZ\Publish\Core\REST\Server\Controller\BinaryContent

Поэтому я безуспешно пытался зарегистрировать ту же службу в своем собственном классе. При посещении приложения мой собственный файл BinaryContent.php не выполняется (я намеренно оставил ошибку разбора, чтобы было понятно).

Что я должен делать?


Согласно комментарий iainn, вот как я пытаюсь переопределить сервис.

В моем файле services.yml:

    ezpublish_rest.controller.binary_content:
        class: Smile\CoreBundle\Core\REST\Server\Controller\BinaryContent
        parent: ezpublish_rest.controller.base
        arguments:
            - "@ezpublish.fieldType.ezimage.variation_service"

Мой пользовательский пакет приложений называется после EzPublishCoreBundle в AppKernel.php.

Вот определение класса BinaryContent:

<?php
namespace Smile\CoreBundle\Core\REST\Server\Controller;

use eZ\Publish\Core\REST\Server\Controller\BinaryContent as BaseController;

class BinaryContent extends BaseController {}

person D4V1D    schedule 29.11.2017    source источник
comment
Можете ли вы показать, как вы пытались переопределить службу, пожалуйста? Должна быть возможность переопределить службу только с помощью имени, предполагая, что файлы загружаются в правильном порядке (т. е. ваша версия загружается после оригинала). В документации Symfony есть еще несколько рекомендаций здесь, если вы не т нашел их уже.   -  person iainn    schedule 29.11.2017
comment
Все, что вам нужно сделать, это настроить параметр ezpublish_rest.controller.binary_content.class так, чтобы он указывал на ваш собственный класс. Более сложным подходом было бы использование прохода компилятора для изменения определения службы. Избегайте расширения пакета. Он никогда не работал хорошо и уходит в S4.   -  person Cerad    schedule 29.11.2017
comment
@Cerad › Я действительно пытался переопределить параметр ezpublish_rest.controller.binary_content.class с помощью пути моего класса в моем собственном файле parameters.yml, но безрезультатно. Ошибка синтаксического анализа не возникает. Мой пакет называется после стороннего, который я пытаюсь переопределить в AppKernel.php.   -  person D4V1D    schedule 30.11.2017
comment
@iainn › Я отредактировал вопрос в соответствии с вашей рекомендацией.   -  person D4V1D    schedule 30.11.2017
comment
@ D4V1D, мой ответ поможет тебе? Я думаю, что это возможный путь!   -  person Renato Mefi    schedule 04.12.2017


Ответы (1)


Создайте проход компилятора, который изменяет класс определения службы.

final class ReplaceBundleServicePass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $serviceDefinition = $container->getDefinition('bundle_service');

        $serviceDefinition->setClass(MyOwnClass::class);
    }
}

Добавление проходов компилятора и время его запуска можно найти в официальной документации: https://symfony.com/doc/current/components/dependency_injection/compilation.html#components-di-compiler-pass

person Renato Mefi    schedule 30.11.2017