Substituindo um controlador principal do Pimcore
Estou trabalhando em um projeto Pimcore há algum tempo, nunca toquei em PHP e Symfony na minha vida, então tem sido um grande desafio.
A documentação é ótima, quero dizer, sério, é ótima, mas parece que não foi feita para iniciantes na linguagem/framework, então tudo o que fiz tive que anotar.
Depois de aprender que você pode estender o Pimcore usando pacotes, passei horas e horas tentando substituir controladores, métodos javascript e muito mais.
Então neste post vou explicar como consegui sobrescrever um controlador. Como substituir arquivos javascript virá mais tarde 😎.
Criando o pacote
Primeiro de tudo precisamos criar um pacote para ele, é bem simples como está documentado na documentação do Pimcore, só precisamos executar bin/console pimcore:generate:bundle --namespace=EmiDemo/EmiDemoBundle na pasta do projeto.
Isso levantará algumas perguntas, mas nada com que se preocupar.

Irá criar uma nova pasta na pasta src com o namespace que declaramos antes, e dentro teremos todos os arquivos necessários para o pacote.

Além disso, o plugin será detectado pelo site de administração do Pimcore, mas será desabilitado, você deve habilitá-lo para começar a usá-lo.

#Substituindo um método de um controlador
Para sobrescrever um método em um controlador, primeiro obviamente você precisa encontrar a ação que deseja atualizar, isso parece fácil, mas vou lhe mostrar como costumo fazer (aprendi com meu colega de equipe Cesar).
Primeiro entre na página que você acha que o controlador entra em ação, no meu caso quero verificar aquela que carrega quando abrimos um ativo
Depois é só abrir o console e ir na aba rede, fazer os mesmos passos novamente e tentar encontrar a ação
Com essas informações você pode ver que a ação que carrega o ativo é http://localhost/admin/asset/get-data-by-id?_dc=1607601778450&id=2&type=image. A partir disso podemos ver que a ação do controlador é get-data-by-id.
Encontre a ação no controlador principal
Para mim, a maneira mais simples de fazer isso é encontrar em todos os arquivos do Visual Studio Code
Provavelmente encontrará mais de um então você deve dar uma olhada e decidir qual é, no nosso caso estamos trabalhando com assets então fica claro que queremos usar o AssetController.php.
Modifique o controlador principal
Depende do desenvolvedor, normalmente não faço isso porque é mais rápido simplesmente substituir o controlador e desenvolver a partir daí. Mas eu recomendo primeiro atualizar o controlador no pacote principal para ver se suas alterações funcionam.
No nosso caso retornarei apenas uma mensagem no início do método para verificar se funciona.
return $this->adminJson(['success' => false, 'message' => "Overriding the getDataByIdAction in the core!!"]);
Então vamos recarregar nosso ativo e verificar a aba rede
Vamos manter o que temos lá, para mais tarde sabermos que estamos usando a mensagem do pacote em vez da mensagem principal.
Agora vamos apenas copiar isso para um arquivo temporário para acompanhar o que fizemos.
Mova essas alterações para o pacote
Agora, para mover essas alterações para o nosso pacote, primeiro precisamos de algumas coisas do nosso controlador principal:
- Espaço para nome
- Importações
- Nome do controlador
E obviamente o método getDataByIdAction que é aquele que queremos substituir.
Exponha o controlador
Precisamos expor o controlador, para fazer isso você precisa entrar no arquivo /src/EmiDemo/EmiDemoBundle/Resources/config/pimcore/routing.yml e adicionar
options:
expose: true
Também precisamos mudar o prefix para aquele que iremos substituir, no nosso caso o controlador admin.
Então no final você vai ficar assim
emi_demo_emi_demo:
resource: "@EmiDemoEmiDemoBundle/Controller/"
type: annotation
prefix: /admin
options:
expose: true
DefaultController.php
Em nosso arquivo, adicionaremos as importações e estenderemos o controlador com aquele que substituiremos
Então iremos apenas copiar o método do controlador principal e, no nosso caso, atualizar a mensagem que retornamos.
Se você se lembra, já temos uma mensagem no controlador principal: Overriding the getDataByIdAction in the core!! e agora devemos ver Overriding the getDataByIdAction in the bundle!!
Vamos apenas não retornar nada e ver que agora podemos ver a página como era antes
Comente a declaração de retorno e recarregue
É isso
E com esta pequena demonstração você pode ver como é fácil substituir um controlador central Pimcore existente. Existem alguns passos que você deve seguir, mas não é nada difícil. Apenas certifique-se de expor o controlador e limpar o cache de vez em quando enquanto estiver fazendo alterações, às vezes ele fica armazenado em cache e você fica pensando que não está funcionando e apenas está armazenado em cache.
Se você está se perguntando como substituir os arquivos javascript, isso virá em outro tutorial 😁.









