Чому cв controllersназві папки є малі літери ? Тоді як модель, блок і помічник починаються з великої літери?
Чому cв controllersназві папки є малі літери ? Тоді як модель, блок і помічник починаються з великої літери?
Відповіді:
Класи, розташовані в controllersпапках, є особливою породою класів.
Ви не можете їх переписати так само, як ви переписуєте модель або блок, використовуючи <rewrite>тег config.xml, ви не можете створити їх за допомогою фабрики, як це зроблено для моделей ( Mage::getModel()) або з helpers ( Mage::helper) або з блоками ( Mage::app()->getLayout()->createBlock()).
Я маю на увазі, що є, Mage::getControllerInstance()але це трохи інакше. Детальніше про це пізніше.
Ви можете помітити, що вони насправді не відповідають правилу іменування, як і інші класи.
Робота controllersне знайдена у назві класу.
Візьмемо для прикладу знайдений контролер Mage/Catalog/controllers/CategoryController.php.
Назва класу - Mage_Catalog_CategoryController.
Я не можу дати тобі 100% певну відповідь, лише основний розробник може це зробити.
Але я припускаю, що хтось не хотів, щоб контролери завантажувались автоматично.
Погляньте на цей метод Mage_Core_Controller_Varien_Router_Standard::match. Це велико і страшно, але це те, що відображає URL-адресу для контролера та дії.
Зроблено багато розрахунків, але десь є цей рядок:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Якщо ми копаємося глибше у _validateControllerClassNameвас, то вийде getControllerFileNameтак:
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;
}
і в _includeControllerClassтому , що в основному робить це: include $controllerFileName;.
Зауважте жорстко закодований controllersметод getControllerFileNameі зауважте, що файл контролера просто включений. Тож ніякої автозавантаження.
Нарешті, фабрика контролерів Mage::getControllerInstance()не розміщує клас і не переглядає переписування. Він просто робить, return new $class($request, $response, $invokeArgs);де $classє клас контролера.
Побічна примітка : У деяких модулях є папка з назвою Controller(з великої літери С), а класи, що відповідають наведеному стандартному іменуванню класів. Ці класи насправді не є контролерами. Вони використовуються як батьківські класи для інших контролерів в модулі або як маршрутизатори.
Бічна примітка 2 : Цього не існує в Magento 2. Усі контролери розташовані в Controllerпапці.
Маріус, ти такий великий: D
Моя відповідь була б просто така:
Це стандарт Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
controllersі я припускаю, що основна команда Mage була б експертом з zend Framework. Кудос. Дякуємо за те, що поділилися цим посиланням