Почему c
строчная в controllers
имени папки? В то время как Model, Block и Helper начинаются с заглавной буквы?
Почему c
строчная в controllers
имени папки? В то время как Model, Block и Helper начинаются с заглавной буквы?
Ответы:
Классы, расположенные в controllers
папках, представляют собой особую породу классов.
Вы не можете переписать их так же, как вы переписываете модель или блок с помощью <rewrite>
тега in 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
(с заглавной буквы C), и классы следуют стандартному именованию классов. Эти классы на самом деле не контроллеры. Они используются в качестве родительских классов для других контроллеров в модуле или в качестве маршрутизаторов.
Примечание 2 : Это не существует в Magento 2. Все контроллеры расположены в Controller
папке.
Мариус ты такой классный: D
Мой ответ был бы просто:
Это стандарт Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
controllers
и я предполагаю, что основная команда Mage будет экспертами Zend Framework. Престижность. Спасибо за то, что поделились этой ссылкой