Documentação do Symfony - versão 3.1
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 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:
1 2 3 4 5 6 7 8 9 10 11 12 | // 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 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 nos templates. Esta é a sintaxe recomendada.
A maioria dos recursos também podem ser substituídos, simplesmente criando um arquivo no mesmo caminho relativo que estiver no bundle pai.
Por exemplo, é muito comum precisar 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ê consegue criar seu próprio arquivo no mesmo lugar relativo dentro do seu bundler (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.
Note
Arquivos de traduções não funcionam da maneira descrita acima. Todos os ficheiros traduzidos serão adicionados em um conjunto de “pools” organizados por dominios. Symfony abrirá os ficheiros de tradução dos bundles primeiro na ordem que eles são inicializados e então do seu diretorio ‘app/Resource’. Se houver dois ficheiros da mesma tradução estiver especificados por diferentes ‘Resources’, o ficheiro de tradução que for aberto por ultimo será o utilizado.