2017-11-29 4 views
1

ezPublish를 사용하는이 웹 사이트는 Symfony 2.8을 기반으로합니다. /이 (app/, src/, web/ 폴더를 포함 등) 프로젝트의 루트입니다Symfony 응용 프로그램에서 타사 번들의 특정 파일을 확장하는 방법은 무엇입니까?

/vendor/ezsystems/ezpublish-kernel/eZ/Publish/Core/REST/Server/Controller :

하는 것은 간단하려면,이 하나 개의 파일에있는 클래스 BinaryContent을 포함 BinaryContent.php이 .

BinaryContent.php을 수정하여 주어진 방법으로 내 자신의 특정 논리를 구현하려고합니다. 그런 식으로 번들을 확장하여이 파일을 재정의하도록 선택합니다. 따라서

는 :

  • 나는 Symfony documentation하지만 클리 어리 상태에 따라 번들을 확장하려고하는이 방법으로

    재정 컨트롤러 번들은을 사용하여 컨트롤러를 참조하는 경우에만 작동합니다 표준 FOSUserBundle : 등록 : 경로 및 템플릿의 구문을 등록하십시오. 이것이 최선의 방법입니다.

나는 이미 그것을하지 않는 것을 알고있다.

  • I이 클래스는 서비스로 등록이 번들 services.yml에 위치하고있다가 :

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

    함께

 
    ezpublish_rest.controller.binary_content: 
     class: "%ezpublish_rest.controller.binary_content.class%" 
     parent: ezpublish_rest.controller.base 
     arguments: 
      - "@ezpublish.fieldType.ezimage.variation_service" 

I 그러므로와 동일한 서비스를 등록하려고 내 자신의 수업을 소용 없습니다. 응용 프로그램을 방문 할 때 내 자신의 BinaryContent.php 파일이 실행되지 않습니다 (나는 intentionnaly 구문 분석 오류를 명확하게 남겨 둡니다).

어떻게해야합니까?


iainn's comment에 따라 여기에 서비스를 재정의하려고합니다. 내 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" 

내 사용자 지정 응용 프로그램 번들은AppKernel.php에서 EzPublishCoreBundle라고합니다.

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

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

class BinaryContent extends BaseController {} 
+0

당신은 당신이 서비스를하시기 바랍니다 무시하려고하는 방법을 보여줍니다 수 있습니까? 파일이 올바른 순서로로드 된 경우 (즉, 버전이 원본보다 나중에로드 된 경우) 이름을 사용하여 서비스를 재정의 할 수 있어야합니다. Symfony 문서들 [here] (https://symfony.com/doc/2.8/bundles/override.html)에 이미 더 많은 가이드 라인이있다. – iainn

+2

ezpublish_rest.controller.binary_content.class 매개 변수를 조정하여 사용자 자신의 클래스를 가리 키기 만하면됩니다. 보다 정교한 접근법은 컴파일러 패스를 사용하여 서비스 정의를 수정하는 것입니다. 번들 확장을 피하십시오. 그것은 잘 돌아 가지 않았고 S4에서 사라질 것입니다. – Cerad

+0

@Cerad> 제 자신의'parameters.yml' 파일에서'ezpublish_rest.controller.binary_content.class' 매개 변수를 내 클래스의 경로로 무효화하려고했습니다. 구문 분석 오류가 발생하지 않습니다. 내 번들은'AppKernel.php'에서 오버라이드하려고하는 써드 파티 이후에 호출됩니다. – D4V1D

답변

0

는 서비스 정의의 클래스를 수정하는 컴파일러 패스를 만듭니다

다음은 BinaryContent 클래스의 정의입니다.

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

관련 문제