Чому 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. Кудос. Дякуємо за те, що поділилися цим посиланням