Substituindo um controlador principal do Pimcore

· 4 min de leitura

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

Imagem de Gyazo

Depois é só abrir o console e ir na aba rede, fazer os mesmos passos novamente e tentar encontrar a ação

Imagem de Gyazo

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

Imagem de Gyazo

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!!"]);

Imagem de Gyazo

Então vamos recarregar nosso ativo e verificar a aba rede

Imagem de GyazoVamos 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

Imagem de Gyazo

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

Imagem de Gyazo

Então iremos apenas copiar o método do controlador principal e, no nosso caso, atualizar a mensagem que retornamos.

Imagem de Gyazo

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!!

Imagem de Gyazo

Vamos apenas não retornar nada e ver que agora podemos ver a página como era antes

Imagem de Gyazo

Comente a declaração de retorno e recarregue

Imagem de Gyazo

É 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 😁.