Почему 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. Престижность. Спасибо за то, что поделились этой ссылкой