Como Sobrescrever qualquer parte de um Bundle

Este documento é uma referência rápida sobre como sobrescrever diferentes partes de bundles de terceiros.

Templates

Para obter informações sobre como sobrescrever templates, consulte * Sobrepondo Templates de Pacote. * Como usar herança para substituir partes de um Bundle

Roteamento

O roteamento nunca é automaticamente importado no Symfony2. Se você quiser incluir as rotas de qualquer bundle, elas devem ser manualmente importadas em algum lugar na sua aplicação (ex.: app/config/routing.yml).

A maneira mais fácil para “sobrescrever” o roteamento de um bundle é nunca importá-lo . Em vez de importar o roteamento de um bundle de terceiros, simplesmente copie o arquivo de roteamento em sua aplicação, modifique-o e importe-o no lugar.

Controladores

Assumindo que o bundle de terceiro envolvido usa controladores não-serviços (que é quase sempre o caso), você pode facilmente sobrescrever os controladores através de herança do bundle: Para mais informações, consulte Como usar herança para substituir partes de um Bundle.

Serviços e Configuração

Existem duas opções para sobrescrever/estender um serviço. Primeiro, você pode definir o parâmetro que contêm o nome do serviço da classe para a sua própria classe, definindo ele em app/config/config.yml. Isto, naturalmente, só é possível se o nome da classe está definido como um parâmetro na configuração de serviço do bundle que contém o serviço. Por exemplo, para sobrescrever a classe usada pelo serviço translator do Symfony, você poderia sobrescrever o parâmetro translator.class. Para saber exatamente qual parâmetro deve-se sobrescrever, poderá ser necessária alguma pesquisa. Para o tradutor, o parâmetro é definido e usado no arquivo Resources/config/translation.xml do FrameworkBundle:

  • YAML
    # app/config/config.yml
    parameters:
        translator.class:      Acme\HelloBundle\Translation\Translator
    
  • XML
    <!-- app/config/config.xml -->
    <parameters>
        <parameter key="translator.class">Acme\HelloBundle\Translation\Translator</parameter>
    </parameters>
    
  • PHP
    // app/config/config.php
    $container->setParameter('translator.class', 'Acme\HelloBundle\Translation\Translator');
    

Em segundo lugar, se a classe não está disponível como um parâmetro, você quer ter a certeza que a classe será sempre sobrescrita quando seu bundle for utilizado, ou quando você precisa modificar algo além do nome da classe, você deve usar um compiler pass:

// src/Acme/FooBundle/DependencyInjection/Compiler/OverrideServiceCompilerPass.php
namespace Acme\DemoBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class OverrideServiceCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $definition = $container->getDefinition('original-service-id');
        $definition->setClass('Acme\DemoBundle\YourService');
    }
}

Neste exemplo, buscamos a definição de serviço do serviço original, e definimos seu nome de classe para a nossa própria classe.

Veja /cookbook/service_container/compiler_passes para obter informações sobre como usar compiler passes. Se você quer fazer algo além de apenas sobrescrever a classe - como adicionar uma chamada de método - você só pode usar o método compiler pass.

Entidades e Mapeamento de Entidade

Em andamento...

Formulários

A fim de sobrescrever um tipo de formulário (form type), ele tem que ser registrado como um serviço (o que significa que tem a tag definida como “form.type”). Você pode, então, sobrescrevê-lo como faria com qualquer serviço, como foi explicado em Serviços e Configuração. Isto, é claro, somente funcionará se o tipo é referido por seu alias, em vez de ser instanciado, ex.:

$builder->add('name', 'custom_type');

em vez de:

$builder->add('name', new CustomType());

Validação de Metadados

Em andamento..

Traduções

Em andamento...