¿Por qué está cen minúsculas en el controllersnombre de la carpeta? ¿Mientras que Modelo, Bloque y Ayudante comienzan con una letra mayúscula?
¿Por qué está cen minúsculas en el controllersnombre de la carpeta? ¿Mientras que Modelo, Bloque y Ayudante comienzan con una letra mayúscula?
Respuestas:
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 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
controllersy supongo que el equipo central de Mage sería un experto en Zend Framework. Prestigio. Gracias por compartir ese enlace