Você está na página 1de 7

Magento para Desenvolvedores: Parte 3 - Magento Controller Dispatch

Categoria: Desenvolvimento
E mais por vir!
A arquitetura Model-View-Controller (MVC) traa as suas origens de volta para a linguagem de
programao Smalltalk e Xerox Parc. Desde ento, tem havido muitos sistemas que descrevem
a sua arquitectura como MVC. Cada sistema um pouco diferente, mas todas tm o objetivo
de separar acesso a dados, lgica de negcios e cdigo de interface do usurio de um outro.
A arquitetura da maioria dos frameworks PHP MVC parece algo como isto .
A URL interceptado por um nico arquivo PHP (normalmente chamado de Front Controller).
Este arquivo PHP ir examinar a URL, e obter um nome de controlador e um nome de ao
(um processo que muitas vezes chamado de roteamento).
O Controlador derivado instanciado.
O nome do mtodo correspondente ao nome de aco derivada chamado no Controller.
Este mtodo de aco ir instanciar e chamar mtodos em modelos, dependendo das variveis
de solicitao.
O mtodo de ao tambm ir preparar uma estrutura de dados de informaes. Esta
estrutura de dados passado para a vista.
A vista em seguida, processa HTML, utilizando as informaes na estrutura de dados que
recebeu o Controller.
Embora este padro foi um grande salto para a frente a partir do "cada arquivo php uma
pgina" padro estabelecido logo no incio, para alguns engenheiros de software, ainda uma
gambiarra. As queixas mais comuns so:
O arquivo frontal do controlador PHP ainda opera no espao global.
Conveno sobre configurao leva a uma menor modularidade.
Encaminhamento URLs frequentemente inflexvel.
Os controladores so muitas vezes obrigados a vises especficas.
Mesmo quando um sistema oferece uma maneira de substituir esses padres, a conveno
resulta em aplicaes onde difcil / impossvel a cair em nova de um novo modelo, viso ou
implementao Controlador sem macio re-factoring.
Como voc j deve ter adivinhado, a equipa de aes Magento esta viso de mundo e criou um
padro mais abstrato MVC que algo como isto: .
A URL interceptado por um nico arquivo PHP.
Este arquivo PHP instancia um aplicativo Magento.
A aplicao Magento instancia um objeto Front Controller.

Front Controller instancia qualquer nmero de objetos Router (especificado na configurao


global).
Routers verificar a URL pedido de um "match".
Se for encontrada uma correspondncia, um controlador e Ao Ao so derivadas.
A Action Controller instanciado eo nome do mtodo correspondente ao nome de Aco
chamado.
Este mtodo de aco ir instanciar e chamar mtodos em modelos, dependendo do pedido.
Esta Action Controller, ento, instanciar um objeto de layout.
Este objeto de layout ir, com base algumas variveis de pedido e propriedades do sistema
(tambm conhecido como "pegas"), criar uma lista de objetos do bloco que so vlidos para
este pedido.
Layout tambm vai chamar um mtodo de sada no determinados objetos do Bloco, que
comeam a render nested (Blocks vai incluir outros blocos).
Cada bloco tem um arquivo de modelo correspondente. Blocos conter a lgica PHP, modelos
contm cdigo de sada HTML e PHP.
Blocos se referir diretamente para os modelos para seus dados. Em outras palavras, o Action
Controller no passar-lhes uma estrutura de dados.
Vamos finalmente tocar em cada parte deste pedido, mas por agora ns estamos preocupados
com o Front Controller -> Routers -> Action Controller seo.
Ol Mundo
Teoria suficiente, hora do Ol Mundo. Ns estamos indo para Criar um mdulo Ol Mundo
no sistema Magento Configure este mdulo com rotas Criar Action Controller (s) para as
nossas rotas
Criar Ol Mdulo Mundial
Primeiro, vamos criar uma estrutura de diretrios para este mdulo. Nossa estrutura de
diretrio deve olhar como se segue:
app / code / local / Magentotutorial / HelloWorld / Bloco
app / code / / Magentotutorial / HelloWorld / controladores locais
app / code / local / Magentotutorial / HelloWorld / etc
app / code / local / Magentotutorial / HelloWorld / Helper
app / code / local / Magentotutorial / HelloWorld / Modelo
app / code / local / Magentotutorial / HelloWorld / sql
Em seguida, crie um arquivo de configurao para o mdulo (pelo caminho app / code / local /
Magentotutorial / Helloworld / etc / config.xml ):

Em seguida, crie um arquivo para ativar o mdulo (pelo caminho app / etc / modules /
Magentotutorial_Helloworld.xml ):

Finalmente, podemos garantir o mdulo est ativo:


Limpe o cache do Magento.
No Magento Admin, v para System-> Configuration-> Avanado .
Expandir "Disable mdulos de sada" (se j no estiver).
Certifique-se de que Magentotutorial_Helloworld aparece.
Configurando Rotas
Em seguida, vamos configurar uma rota. A rota vai virar uma URL em um Action Controller e
um mtodo. Ao contrrio de outros sistemas PHP MVC conveno baseada, com Magento,
voc precisa definir explicitamente uma rota no config Magento global.
Em seu arquivo config.xml, adicione a seguinte seo:

Temos um monte de nova terminologia aqui, vamos dividi-la.


O que um <frontend>?
O <frontend> marca refere-se a uma rea de Magento. Por agora, penso em reas como
aplicativos Magento individuais. O "frontend" Area o shopping Magento carrinho aplicao
voltados ao pblico. O "admin" Area a aplicao console administrativo privada. A rea
"install" o aplicativo que voc usa para executar embora a instalao Magento pela primeira
vez.
Por que a <roteadores> marcas se estamos configurando rotas individuais?
H uma famosa citao sobre cincia da computao, muitas vezes atribuda a Phil Karlton:
"Existem apenas duas coisas difceis em Cincia da Computao: invalidao de cache e
nomear as coisas"
Magento, como todos os grandes sistemas, sofre com o problema de nomenclatura em
espadas. Voc vai descobrir que h muitos lugares na configurao global e do sistema em
geral, onde as convenes de nomenclatura parece unintuitive ou mesmo ambgua. Este um
desses lugares. s vezes, os roteadores <> tag vai incluir informaes de configurao sobre
roteadores, outras vezes ele vai incluir informaes de configurao sobre os objetos do
roteador reais que fazem o roteamento. Isto vai parecer contra-intuitivo no incio, mas quando
voc comea a trabalhar com Magento mais e mais, voc vai comear a entender a sua viso
de mundo um pouco melhor. (Ou, nas palavras de Han Solo, "Hey, confie em mim!").
O que um <frontName>?
Quando um roteador analisa uma URL, ele separado do seguinte
http://example.com/frontName/actionControllerName/actionMethod/
Assim, atravs da definio de um valor de "helloworld" no <frontName> marcas, ns estamos
dizendo Magento que queremos que o sistema responda a URLs na forma de
http://example.com/helloworld/*
Muitos desenvolvedores novos para Magento confundir este frontName com o objeto Front
Controller. Eles sono a mesma coisa. O frontName pertence exclusivamente ao roteamento.
Qual o <helloworld> tag para?
Esta tag deve ser a verso minscula de voc nome do mdulo. Nosso nome do mdulo
Helloworld, esta tag helloworld. Tecnicamente esta tag define a nossa nome da rota
Voc tambm vai notar a nossa frontName corresponde a nossa nome do mdulo. uma
conveno solta ter frontNames coincidir com os nomes dos mdulos, mas no uma
exigncia. Em seus prprios mdulos, provavelmente melhor usar um nome de rota que
uma combinao do seu nome do mdulo e nome do pacote para evitar possveis conflitos de
namespace.
O que <module> Magentotutorial_Helloworld </ module> for?
Esta tag mdulo deve ser o nome completo do seu mdulo, incluindo o seu nome do pacote /
namespace. Isso ser usado pelo sistema para localizar seus arquivos do controlador.

Criar Action Controller (s) para as nossas rotas


Um ltimo passo para ir, e ns vamos ter a nossa Action Controller. Crie um arquivo em
app / code / local / Magentotutorial / HelloWorld / controllers / IndexController.php
Que contm o seguinte

Limpe o cache de configurao, e carregar o seguinte URL


http://exmaple.com/helloworld/index/index
Voc tambm deve ser capaz de carregar
http://exmaple.com/helloworld/index/
http://exmaple.com/helloworld/
Voc dever ver uma pgina em branco com o texto "Ol Mundo". Parabns, voc configurar o
seu primeiro controlador Magento!
Onde que os controladores de ao ir?
Controladores de ao deve ser colocado em um mdulo controladores (c minsculo) da
pasta. Este o lugar onde o sistema ir procur-los.
Como deve controladores de ao ser nomeado?
Lembre-se o <module> tag de volta em config.xml?
< mdulo > Magentotutorial_Helloworld </ mdulo >
O nome de um controlador de Ao dever
Comece
com
este seqncia
(Magentotutorial_Helloworld )

de

caracteres

especificada

no

config.xml

Ser seguido por um sublinhado ( Magentotutorial_Helloworld_ )


Que ser seguido pelo nome do Action Controller ( Magentotutorial_Helloworld_Index )
E, finalmente, a palavra "Controller" ( Magentotutorial_Helloworld_IndexController )

Todos os controladores de ao precisa Mage_Core_Controller_Front_Action como um


antepassado.
O que isso um absurdo index / index?
Como j mencionado anteriormente, URLs Magento so encaminhadas (por padro) da
seguinte forma
http://example.com/frontName/actionControllerName/actionMethod/
Assim, na URL
http://example.com/helloworld/index/index
o URI poro "olamundo" o frontName, que seguido pelo ndice (o nome do controlador de
aco), que seguido por outro ndice, que o nome do mtodo de aco que ir ser
chamado. (Uma Ao de ndice ir chamar o mtodo da funo pblica ndice Ao () {...} .
Se a URL est incompleto, Magento usa "index" como padro, razo pela qual os seguintes
URLs so equivalentes.
http://example.com/helloworld/index
http://example.com/helloworld
Se tivssemos uma URL que olhou como este
http://example.com/checkout/cart/add
Magento faria
Consulte a configurao global para encontrar o mdulo a ser usado para o check-out
frontName (Mage_Checkout )
Procure o controlador carrinho Ao ( Mage_Checkout_CartController )
Chame o addAction mtodo no Controlador carrinho Ao
Outros truques Action Controller
Vamos tentar adicionar um mtodo no-default para a nossa Action Controller. Adicione o
seguinte cdigo para IndexController.php

E, em seguida, visite o URL para test-lo:


http://example.com/helloworld/index/goodbye
Porque ns estamos estendendo o Mage_Core_Controller_Front_Action classe, temos alguns
mtodos para livre. Por exemplo, elementos de URL adicionais so automaticamente analisado
em pares de chave / valor para ns. Adicione o seguinte mtodo para o seu Action Controller.

e visite o seguinte URL


http://example.com/helloworld/index/params?foo=bar&baz=eof
Voc deve ver cada parmetro e valor impresso.
Finalmente, o que faramos se queramos uma URL que respondeu em
http://example.com/helloworld/messages/goodbye
Aqui o nome do nosso Action Controller mensagens, por isso, seria criar um arquivo em
app / code / local / Magentotutorial / HelloWorld / controllers / MessagesController.php
com um controlador de Ao nomeado Magentotutorial_Helloworld_MessagesController e um
mtodo de ao que parecia algo como

E que, em poucas palavras, como Magento implementa a parte do controlador de


MVC. Embora seja um pouco mais complicado do que o outro PHP MVC framework de, um
sistema altamente flexvel que permitir que voc construir quase qualquer estrutura de URL
que voc deseja.

Você também pode gostar