Por que cletras minúsculas no controllersnome da pasta? Enquanto Model, Block e Helper estão começando com uma letra maiúscula?
Por que cletras minúsculas no controllersnome da pasta? Enquanto Model, Block e Helper estão começando com uma letra maiúscula?
Respostas:
As classes localizadas nas controllerspastas 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 controllersnã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, _validateControllerClassNamevocê terminará getControllerFileNameassim:
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 _includeControllerClassque, basicamente, faz isso: include $controllerFileName;.
Observe o código embutido controllersno método getControllerFileNamee 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 $classestá 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 Controllerpasta.
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
controllerse presumo que a equipe principal do Mage seria uma especialista em estrutura zend. Parabéns. Obrigado por compartilhar esse link