Por que c
letras minúsculas no controllers
nome da pasta? Enquanto Model, Block e Helper estão começando com uma letra maiúscula?
Por que c
letras minúsculas no controllers
nome da pasta? Enquanto Model, Block e Helper estão começando com uma letra maiúscula?
Respostas:
As classes localizadas nas controllers
pastas são uma raça especial de classes.
Você não pode reescrevê-los da mesma maneira que reescreve um modelo ou um bloco usando a <rewrite>
tag in config.xml
, não pode instancia-los usando uma fábrica como faz para modelos ( Mage::getModel()
) ou com auxiliares ( Mage::helper
) ou com blocos ( Mage::app()->getLayout()->createBlock()
).
Quero dizer, existe, Mage::getControllerInstance()
mas isso é um pouco diferente. Mais sobre isso mais tarde.
Você pode perceber que eles não seguem a regra de nomenclatura como as outras classes.
O trabalho controllers
não foi encontrado no nome da classe.
Vamos pegar, por exemplo, o controlador encontrado em Mage/Catalog/controllers/CategoryController.php
.
O nome da classe é Mage_Catalog_CategoryController
.
Não posso lhe dar uma resposta 100% certa, apenas um desenvolvedor principal pode fazer isso.
Mas suponho que alguém não queira que os controladores sejam carregados automaticamente.
Dê uma olhada neste método Mage_Core_Controller_Varien_Router_Standard::match
. É grande e assustador, mas é o que mapeia um URL para um controlador e uma ação.
Existem muitos cálculos feitos, mas em algum lugar existe esta linha:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Se aprofundarmos mais, _validateControllerClassName
você terminará getControllerFileName
assim:
public function getControllerFileName($realModule, $controller)
{
$parts = explode('_', $realModule);
$realModule = implode('_', array_splice($parts, 0, 2));
$file = Mage::getModuleDir('controllers', $realModule);
if (count($parts)) {
$file .= DS . implode(DS, $parts);
}
$file .= DS.uc_words($controller, DS).'Controller.php';
return $file;
}
e em _includeControllerClass
que, basicamente, faz isso: include $controllerFileName;
.
Observe o código embutido controllers
no método getControllerFileName
e observe que o arquivo do controlador está incluído. Portanto, sem carregamento automático.
Por fim, a fábrica do controlador Mage::getControllerInstance()
não localiza a classe e não procura nas reescritas. Apenas faz return new $class($request, $response, $invokeArgs);
onde $class
está a classe do controlador.
Nota lateral : Em alguns módulos, há uma pasta chamada Controller
(com C maiúsculo) e as classes seguem a nomeação de classe padrão. Essas classes não são realmente controladoras. Eles são usados como classes pai para outros controladores no módulo ou como roteadores.
Nota lateral 2 : Isso não existe no Magento 2. Todos os controladores estão localizados na Controller
pasta.
Marius você é tão legal: D
Minha resposta seria apenas:
Este é o padrão do Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
controllers
e presumo que a equipe principal do Mage seria uma especialista em estrutura zend. Parabéns. Obrigado por compartilhar esse link