Так что у меня есть этот сайт, который использует ezPublish (который сам основан на Symfony 2.8).
Чтобы сделать это просто, у меня есть этот файл BinaryContent.php
который содержит класс BinaryContent
расположен в :
/vendor/ezsystems/ezpublish-kernel/eZ/Publish/Core/REST/Server/Controller
где /
является корнем проекта (который содержит app/
, src/
, web/
папки и тд).
Я намерен изменить BinaryContent.php
реализовать мою собственную конкретную логику в данном методе. Таким образом, я выбираю переопределение этого файла путем расширения пакета.
Следовательно:
Переопределение контроллеров таким образом работает только в том случае, если пакет ссылается на контроллер, использующий стандарт FOSUserBundle: Регистрация: зарегистрировать синтаксис в маршрутах и шаблонах. Это лучшая практика.
Я уже знаю, что нет.
services.yml
этого пакета, что этот класс зарегистрирован в качестве службы:ezpublish_rest.controller.binary_content: класс: "% ezpublish_rest.controller.binary_content.class%" родитель: ezpublish_rest.controller.base аргументы: - "@ ezpublish.fieldType.ezimage.variation_service"
вместе с
параметры: ezpublish_rest.controller.binary_content.class: eZ \ Publish \ Core \ REST \ Server \ Controller \ BinaryContent
Поэтому я попытался зарегистрировать тот же сервис в своем классе, но безрезультатно. При посещении приложения мой BinaryContent.php
файл не выполняется (я намеренно оставил ошибку разбора, чтобы прояснить ситуацию).
Что я должен делать?
Согласно комментарий Айнна, Вот как я пытаюсь переопределить службу.
В моем services.yml
файл:
ezpublish_rest.controller.binary_content: класс: Smile \ CoreBundle \ Core \ REST \ Server \ Controller \ BinaryContent родитель: ezpublish_rest.controller.base аргументы: - "@ 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 {}
Создайте проход компилятора, который изменяет класс определения сервиса.
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
Других решений пока нет …