¿Por qué está c
en minúsculas en el controllers
nombre de la carpeta? ¿Mientras que Modelo, Bloque y Ayudante comienzan con una letra mayúscula?
¿Por qué está c
en minúsculas en el controllers
nombre de la carpeta? ¿Mientras que Modelo, Bloque y Ayudante comienzan con una letra mayúscula?
Respuestas:
Las clases ubicadas en las controllers
carpetas 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 controllers
no 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 getControllerFileName
ese 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 _includeControllerClass
que, básicamente, hace esto: include $controllerFileName;
.
Observe el código rígido controllers
en el método getControllerFileName
y 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 $class
está 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 Controller
carpeta.
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
controllers
y supongo que el equipo central de Mage sería un experto en Zend Framework. Prestigio. Gracias por compartir ese enlace