¿Por qué c es minúscula en los controladores de Magento?

28

¿Por qué está cen minúsculas en el controllersnombre de la carpeta? ¿Mientras que Modelo, Bloque y Ayudante comienzan con una letra mayúscula?

Muthu
fuente
66
Oye ... ¿por qué el voto negativo? Esta es una pregunta legítima y realmente buena.
Marius
Hay un miembro (no diré el nombre, por supuesto) que está marcando / rechazando al azar. Por ejemplo, esta pregunta se marcó como ofensiva: D
user487772
@TimBezhashvyly ... sí, lo entiendo. Me pareció ofensivo al principio, pero luego leí la pregunta nuevamente :)
Marius
El controlador con C mayúscula ya fue tomado jaja.
Julien Lachal

Respuestas:

28

Las clases ubicadas en las controllerscarpetas son una clase especial de clases.
No puede reescribirlos de la misma manera que reescribe un modelo o un bloque usando la <rewrite>etiqueta config.xml, no puede crear una instancia usando una fábrica como lo hace para los modelos ( Mage::getModel()) o con ayudantes ( Mage::helper) o con bloques ( Mage::app()->getLayout()->createBlock()).
Quiero decir que hay Mage::getControllerInstance()pero eso es un poco diferente. Más sobre esto más tarde.
Puede notar que en realidad no siguen la regla de nomenclatura como las otras clases.
El trabajo controllersno se encuentra en el nombre de la clase.
Tomemos por ejemplo el controlador encontrado en Mage/Catalog/controllers/CategoryController.php.
El nombre de la clase es Mage_Catalog_CategoryController.
No puedo darte una respuesta 100% segura, solo un desarrollador principal puede hacerlo.
Pero supongo que alguien no quería que los controladores se cargaran automáticamente.

Echa un vistazo a este método Mage_Core_Controller_Varien_Router_Standard::match. Es grande y aterrador, pero ese es el que asigna una url a un controlador y una acción.
Se realizan muchos cálculos, pero en alguna parte hay esta línea:

$controllerClassName = $this->_validateControllerClassName($realModule, $controller);

Si cavamos más profundo en el _validateControllerClassName, terminarás en getControllerFileNameese aspecto:

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;
}

y en el _includeControllerClassque, básicamente, hace esto: include $controllerFileName;.

Observe el código rígido controllersen el método getControllerFileNamey observe que el archivo del controlador solo se incluye. Así que no hay carga automática.

Finalmente, la fábrica de controladores Mage::getControllerInstance()no localiza la clase y no busca en las reescrituras. Simplemente hace return new $class($request, $response, $invokeArgs);dónde $classestá la clase de controlador.

Nota al margen : en algunos módulos hay una carpeta llamada Controller(con C mayúscula) y las clases siguen el nombre de clase estándar. Esas clases no son realmente controladores. Se utilizan como clases principales para otros controladores en el módulo o como enrutadores.

Nota al margen 2 : Esto no existe en Magento 2. Todos los controladores están ubicados en la Controllercarpeta.

Marius
fuente
15

Marius eres tan genial: D

Mi respuesta solo hubiera sido:

Este es el estándar de Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html

Fabian Blechschmidt
fuente
1
En realidad es una buena respuesta.
Marius
1
Esta es una hermosa respuesta. Creo que esta sería una respuesta más correcta que Marius. Porque un desarrollador de Zend Framework no pensaría en otro directorio que no sea controllersy supongo que el equipo central de Mage sería un experto en Zend Framework. Prestigio. Gracias por compartir ese enlace
Rajeev K Tomy
Muy útil
Amit Bera
1
Sí, creo que esta es la respuesta correcta también. Ni siquiera me molesté en mirar los estándares ZF. Solo intenté encontrar una explicación lógica. En mi defensa, dije en la respuesta que era mi opinión.
Marius