Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github
Este documento é uma referência rápida sobre como sobrescrever diferentes partes de bundles de terceiros.
Para obter informações sobre como sobrescrever templates, consulte * Sobrepondo Templates de Pacote. * Como usar herança para substituir partes de um Bundle
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.
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.
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:
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.
Em andamento...
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());
Em andamento..
Em andamento...