Processamento do fluxo de requisição
Processamento do fluxo de requisição do Magento 2
- Utilizar os modos de deploy da Magento e conhecer as etapas da inicialização da aplicação
- Demonstrar habilidade para processar URLs do Magento
- Demonstrar habilidade para personalizar rotas de requisição
- Descrever o processo de inicialização do layout
- Descrever a estrutura dos
block templates
Utilizar os modos de deploy da Magento e conhecer as etapas da inicialização da aplicação
Identificar as etapas para a inicialização da aplicação.
- Ponto de entrada da aplicação:
pub/index.php
. - O bootstrap é inicializado:
Magento\Framework\App\Bootstrap->run()
. - É criada a aplicação HTTP (
\Magento\Framework\App\Http
):Magento\Framework\App\Http\Interceptor->launch()
- É determinado o código da área do Magento
- Baseado na área, o front controller é criado (HTTP, Rest, Soap, etc): o front controller vai direcionar a solicitação
Magento\Framework\App\FrontController\Interceptor->dispatch()
: Aqui a lista de routers é percorrida e cada um é verificado se corresponde à rota.- Se corresponder, a classr
\Magento\Framework\App\ActionInterface
é retornada e suaaction
é executada. - O método
execute
do controller é executado. - O
Result
disto é retornado para oFrontController
- O
Result
é renderizado e definido naResponse
- Voltamos para a classe
Http
.
Como você projetaria uma personalização que deveria agir em cada requisição e capturar dados de saída, independentemente do controller? Seria uma boa oportunidade para usar os observers
. Nesse caso, para o evento controller_action_postdispatch
.
Descrever como usar os modos Magento.
Entender os prós e contras usando o modo desenvolvedor/produção? Como você usa o modo default? Discutimos isso aqui e aqui.
Como você ativa/desativa o modo de manutenção?
bin/magento maintenance:enable
bin/magento maintenance:disable
Descrever as responsabilidades do front controller.
O front controller implementa a interface \Magento\Framework\App\FrontControllerInterface
e é responsável por executar a lógica de negócios e retornar o resultado dela. Este resultado pode ser um simples layout HTML ou algo mais complexo, como um objeto para edição.
Em quais situações o controller frontal é envolvido na execução e como ele é usado nas customizações do escopo? O FrontController
é envolvido em todas as requisições que não sejam API. Ele é o ponto de entrada para o processamento do fluxo de requisição. Ele é usado para transformar o input de uma url e seus parêmetros em uma resposta HTML. Não é usado em API ou no console.
Demonstrar habilidade para processar URLs do Magento
Descrever como a Magento processa uma dada URL.
Há uma boa referência sobre o assunto no DevDocs.
Como você identifica qual modulo e controller corresponde a uma certa URL?
O Magento determina a área baseado no frontname (que é registrado no routes.xml
). Se não houver um frontname que corresponda à rota, o padrão é usar a área frontend
.
\Magento\Framework\App\AreaList::getCodeByFrontName
Se não for uma requisição de API, o Magento analisa a URL usando o \Magento\Framework\App\Router\Base::parseRequest
. A parte explorada é o path
, que corresponde ao seguimento após o domínio.
A maior parte das URLs no magento podem ser divididas em 5 partes: <store-url>/<front-name>/<controller-name>/<action-name>
- Primeiro a url da loja
store-url
. - Em seguida, o
frontname
. Exemplo:catalog
. - Depois, o nome do
controller
. E consideramos o caminho até a classe, a partir da pastaController
. Exemplo: emproduct
. - Então o nome da classe da ação (
action-name
). Esta classe deve implementar aActionInterface
e possuir um métodoexevute
- Por fim, vem os parâmetros. Exemplo:
id/54
.
O que é necessário para criar uma estrutura personalizada de URL?
- Crie uma nova classe router, na pasta
Controller
, que implementa a interface\Magento\Framework\App\RouterInterface
. - Registre o router no arquivo
di.xml
- Crie uma Action, instancia de
\Magento\Framework\App\ActionInterface
- Registre a rota da action no arquivo
routes.xml
Há um exemplo passo a passo aqui.
Descrever como é o processo de reescrita e sua função na criação de URL amigáveis.
Como as URLs amigáveis são definidas, e como elas são customizadas? As URLs amigáves são apelidos para as URLs padrão do Magento. Ao invés de mostrar a url htpps://loja.com/catalog/product/view/id/54
, o link para este produto será: htpps://loja.com/meu-produto
. Essa reescrita pode ser feita automaticamente, se configurado. O Magento usa a tabela url_rewrite
para armazenar e mapear as URLs no banco de dados.
request_path
: “minha-url-amigavel”target_path
: “catalog/product/view/id/54”
As URLs amigáveis vem do campo url_key
, este atributo existe no cadastro de produtos, categorias e páginas cms.
Descrever como funcionam as ações e resultados dos controllers.
- Os
controllers
de ação implementam o a interface\Magento\Framework\App\ActionInterface
e estendem a classe\Magento\Framework\App\Action\Action
em algum ponto. - Cada
controller
tem apenas uma únicaaction
. - O método
execute
deve retornar\Magento\Framework\Controller\ResultInterface
(para HTML, JSON ou outros tipos de output).
Como os controladores interagem uns com os outros?
- Um
controller
pode encaminhar para outra rota. Não é exibida nenhuma alteração na URL, mas um novocontroller
assume o processamento da URL. Isso reinicia o loop de correspondência do router com novos argumentos. Ver:\Magento\Framework\Controller\Result\Forward
. - O
controller
pode redirecionar para outra URL. Ver:\Magento\Framework\Controller\Result\Redirect
.
Como os diferentes tipos de resposta são gerados? O Magento possui alguns tipos de resposta, todos implementam a interface \Magento\Framework\Controller\ResultInterface
. Usamos estas classes de resposta da seguinte forma:
- Definimos qual o tipo a ser usado
- Injetamos a
Factory
da classe no nossocontroller
. - Criamos uma instancia desta classe, definimos o que precisamos e à retornamos.
Os tipos de resposta já existentes no Magento são:
Magento\Framework\Controller\Result\Forward
Magento\Framework\Controller\Result\Json
Magento\Framework\Controller\Result\Raw
Magento\Framework\Controller\Result\Redirect
Magento\Framework\View\Result\Page
Demonstrar habilidade para personalizar rotas de requisição
Descrever o roteamento e o fluxo da requisição na Magento.
Quando é necessário criar um novo roteador ou customizar os roteadores existentes? Quando temos grandes quantidades de personalizações de url ou situações que não são atendidas pela funcionalidade nativa do Magento. Um exemplo de situação para criar um router personalizado seria para um módulo de blog.
Como você manipula páginas 404 customizadas? A página 404 é uma página CMS armazenada no banco de dados. Pode ser modificada usando HTML/CSS ou o Page Builder (no caso de ser Adobe Commerce). Para modificações mais profundas, pode-se usar um NoRouteHandler
na classe \Magento\Framework\App\Router\NoRouteHandlerList
.
Classes que implementam a Magento\Framework\App\Router\NoRouteHandlerInterface
:
Magento\Backend\App\Router\NoRouteHandler
Magento\Framework\App\Router\NoRouteHandler
Descrever o processo de inicialização do layout
Determinar como o layout é compilado.
Todos os arquivos de layouts XML são mesclados em um XML que é armazenado no cache de layout. A sequência em que eles são carregados é determinada pelo nó sequence
no etc/module.xml
.
Para uma página particular o seu layout é definido por 3 principais componentes:
Page layout:
Define o page wireframe
, a estrutura, por exemplo, one-column, two-column etc. São localizados em <module_dir>/view/frontend/page_layout
ou <theme_dir>/<Namespace>_<Module>/page_layout
. Exemplo de arquivo: view/frontend/page_layout/2columns-left.xml
. Para utilizar um layout, ele precisa ser declarado no arquivo layouts.xml
, que pode ser colocado em <module_dir>/view/frontend/layouts.xml
ou <theme_dir>/<Namespace>_<Module>/layouts.xml
O Magento possui, nativamente, 5 tipos de layout de página para o
frontend
(empty, 1column, 2columns-left, 2columns-right e 3columns) e 3 tipos para obackend
(admin-empty, admin-1column, and admin-2columns-left).
Page configuration:
Detalha o conteúdo do wireframe
da página, blocos (header, footer, etc), meta information
e conteúdos da seção <head>
. São localizados em <module_dir>/view/frontend/layout
ou <theme_dir>/<Namespace>_<Module>/layout
.
Generic layout:
Layouts genéricos que definem o conteúdo e a estrutura detalhada dentro da seção <body>
da marcação da página HTML. Também ficam em <module_dir>/view/frontend/layout
ou <theme_dir>/<Namespace>_<Module>/layout
.
Para mais informações sobre os tipos de arquivos de layout, clique aqui.
Como você depuraria seus arquivos de layout.xml e verificaria que foram usadas as instruções de layout corretas?
- Verifique se o seu layout XML está sendo processado. Isso pode ser feito com um breakpoint no
foreach
em\Magento\Framework\View\Model\Layout\Merge::_loadFileLayoutUpdatesXml
. - Verifique se o seu XML está correto, podes-se usar um validador de XML para isso.
- Usando o modo de desenvolvimento, verifique se algum erro é apresentado no
frontend
. - Verifique os
handles
carregados na página. - Verifique se o nome do XML está correto.
- No caso de um bloco com uma classe própria, verifique se a classe existe e está sendo carregada.
- Verifique se a saída HTML está sendo processada corretamente (método
toHtml
).
Determinar como a saída HTML é renderizada.
Como a Magento descarrega a saída e quais mecanismos existem para acessar e customizar a saída?
Layout rendering: \Magento\Framework\View\Layout::getOutput()
. Block renderer: \Magento\Framework\View\Element\AbstractBlock::toHtml()
Para customizar o output
, você pode:
- Modificar o arquivo layout XML
- Sobrescrever templates phtml
- Adicionar um
layout handle
em\Magento\Framework\View\Result\Page
. - Sobrescrever o método
_toHtml
do bloco - Criar uma
result class
customizada (estendendo a classe\Magento\Framework\View\Result\Page
) e a aplicando nocontroller
.
Determinar o esquema de layout XML de um módulo.
Como você adiciona novos elementos em uma página introduzida por um certo módulo?
Isso pode ser feito através do XML layout da página. Para tanto, é necessario saber qual handle
será utilizado. Se não souber quais handles
estão disponíveis, basta verificar o atributo classe da tag html <body>
ou utiliar o método \Magento\Framework\View\Layout\ProcessorInterface::getHandles()
. Com o handle em mãos, crie o xml com o mesmo nome. No arquivo, basta utilizar as instruções de layout para adicionar ou modificar elementos.
Demonstrar capacidade para usar o fallback do layout para personalizações e depuração.
Uma forma prática de verificar o
fallback
é executar$fallbackRule->getPatternDirs($params)
emvendor/magento/framework/View/Design/FileResolution/Fallback/Resolver/Simple.php::resolveFile
Como você identifica exatamente qual arquivo de layout.xml é processado em um determinado escopo?
- Verifique qual área está sendo carregada
- Localize o
layout handle
- Busque no projeto arquivos com o mesmo nome
Como a Magento trata arquivos de layout XML com os mesmos nomes em módulos diferentes?
É utilizado o nó sequence
para determinar a ordem dos arquivos que serão carregados.
Identificar as diferenças entre os escopos admin e frontend.
Quais as diferenças existentes na inicialização do layout para o escopo de admin?
Na área adminhtml
o Magento ACL determina o que pode ou não pode ser exibido.
Descrever a estrutura dos block templates
A estrutura de uma página é definida nos arquivos de layout, dentro do nó page
. Os arquivos de layout possuem o nome de um handle
da página.
Identificar e entender os templates root, empty.xml, e page_layout.
Como as estruturas da página são definidas, incluindo o número de colunas, quais containers básicos são apresentados, etc.?
O root template
é o template mais simples. Temos apenas um no Magento: vendor/magento/module-theme/view/base/templates/root.phtml
. Ele é injetado no result page
do controllers
através de dependency injection
:
vendor/magento/module-backend/etc/adminhtml/di.xml
vendor/magento/magento2-base/app/etc/di.xml
O empty.xml
é o layout XML “pai”. Todos os outros arquivos de layout de página derivam e estentem ele.
vendor/magento/module-theme/view/base/page_layout/empty.xml
No diretório page_layout
são colocados os XMLs de layouts de página. Por exemplo, no Magento temos os layouts 1column.xml
, 2columns-left
, 2columns-right.xml
e 3columns.xml
. Pode-se criar um novo layout de página adicionando novos arquivos ao diretório page_layout
dentro do módulo ou tema.
- ` vendor/magento/module-theme/view/frontend/page_layout`
Configure o layout de uma página no atributo
layout=""
do nó<page>
no arquivo XML.
Descrever a função de blocos e templates no fluxo de requisição.
Em quais situações você criaria um novo bloco ou um novo template?
- Um
view model
pode ser usado para fornecer dados para um template. Então, na maioria das vezes, não é necessário criar uma nova classe de bloco. - A classe padrão dos blocos é a
\Magento\Framework\View\Element\Template
e pode ser omitida. - Os
templates
são criados para mostrar informação.