Por que c é minúsculo nos controladores do Magento?

28

Por que cletras minúsculas no controllersnome da pasta? Enquanto Model, Block e Helper estão começando com uma letra maiúscula?

Muthu
fonte
6
Ei ... por que o voto negativo? Esta é uma pergunta legítima e realmente boa.
Marius
Há um membro (não vou dizer o nome, é claro) que está sinalizando / votando de forma aleatória. Por exemplo, esta pergunta foi sinalizada como ofensiva: D
user487772
@TimBezhashvyly ... sim, eu entendo isso. Ele cosido ofensivo para mim no começo, mas então eu li a pergunta novamente :)
Marius
Controlador com um capital C já foi levado haha.
Julien Lachal

Respostas:

28

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
fonte
15

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

Fabian Blechschmidt
fonte
1
Na verdade, é uma boa resposta.
Marius
1
Esta é uma resposta bonita. Eu acho que essa seria uma resposta mais correta do que Marius. Como um desenvolvedor de estrutura zend não pensaria em outro diretório além de, controllerse presumo que a equipe principal do Mage seria uma especialista em estrutura zend. Parabéns. Obrigado por compartilhar esse link
Rajeev K Tomy
Ajuda muito completa
Amit Bera
1
Sim, acho que esta é a resposta correta também. Eu nem me preocupei em olhar para os padrões da ZF. Eu apenas tentei encontrar uma explicação lógica. Em minha defesa, afirmei na resposta que era minha opinião.
Marius