Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github
Ao trabalhar com bundles de terceiros, você frequentemente precisará substituir um arquivo dele por um próprio seu para personalizar seu comportarmento ou aparência. Symfony possui uma maneira bem conveniente de personalizar controllers, templates, Traduções e outros arquivos do diretório Resources/ de um bundle.
Por exemplo, suponha que você está instalando FOSUserBundle, mas você quer que a template layout.html.twig o um dos seus controllers seja aqueles que você personalizou e colocou no seu bundle. No exemplo a seguinte estamos assumindo que você já tenha o bundle AcmeUserBundle e coloque os arquivos personalizados nele. O primeiro passo é registrar o bundle FOSUserBundle como pai do seu bundle:
// src/Acme/UserBundle/AcmeUserBundle.php
namespace Acme\UserBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeUserBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
Esta simples alteração permitirá que substitua vários partes de FOSUserBundle simplesmente criando um arquivo com o mesmo nome.
Suponha que você queira adicionar alguma funcionalidade a ação registerAction do controlador RegistrationController que está dentro do bundle FOSUserBundle. Para fazê-lo, basta criar o seu próprio RegistrationController.php, crie um método que substitua o do bundle original e mude sua funcionalidade como mostrado a seguir.
// src/Acme/UserBundle/Controller/RegistrationController.php
namespace Acme\UserBundle\Controller;
use FOS\UserBundle\Controller\RegistrationController as BaseController;
class RegistrationController extends BaseController
{
public function registerAction()
{
$response = parent::registerAction();
// do custom stuff
return $response;
}
}
Tip
Dependendo do tipo de personalização que precisa fazer no controlador, você pode substituir completamente o método com lógica própria sem nem mesmo chamar parent::registerAction().
Note
Substituir controladores desta maneira somente funciona se o bundle referencia o controlador utilizando sintaxe padrão FOSUserBundle:Registration:register nas rotas e nas templates. Este é a sintaxe recomendada.
A maioria dos recursos também podem ser substituídas, simples criando um arquivo no mesmo caminho relativo que estiver no bundle pai.
Por exemplo, é muito comum precisar de substituir o arquivo de template layout.html.twig do bundle FOSUserBundle para utilizar o layout base de sua própria aplicação. Uma vez que o arquivo fica no caminho Resources/views/layout.html.twig dentro do bundle FOSUserBundle você pode seu próprio aruqivo no mesmo lugar relativo (por exemplo, Resources/views/layout.html.twig do bundle FOSUserBundle). O Symfony vai ignorar o arquivo dentro do FOSUserBundle e utilizar o seu no lugar.
O mesmo vale para arquivos de rotas, configuração de Validação e outros recursos.
Note
A substituição de recursos só funciona quando você se refere a recursos utilizando a sintaxe recomendada @FosUserBundle/Resources/config/routing/security.xml. Se você se referir a recursos sem o atalho @FosUserBundle, eles não serão substituídos.