Почему c строчные в контроллерах Magento?

28

Почему cстрочная в controllersимени папки? В то время как Model, Block и Helper начинаются с заглавной буквы?

Muthu
источник
6
Эй ... почему понизить? Это законный и действительно хороший вопрос.
Мариус
Есть участник (я не буду называть имя, конечно), который помечает / понижает голос случайным образом. Например, этот вопрос был помечен как оскорбительный: D
user487772
@ ТимБежашвили ... да, я это понимаю. Сначала это показалось мне оскорбительным, но потом я снова прочитал вопрос :)
Мариус
Контроллер с большой буквы уже был взят хаха.
Жюльен Лахаль

Ответы:

28

Классы, расположенные в 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папке.

Мариус
источник
15

Мариус ты такой классный: D

Мой ответ был бы просто:

Это стандарт Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html

Фабиан Блехшмидт
источник
1
На самом деле это хороший ответ.
Мариус
1
это красивый ответ. Я думаю, что это был бы более правильный ответ, чем Мариус. Потому что разработчик Zend Framework не будет думать о другом каталоге, кроме, controllersи я предполагаю, что основная команда Mage будет экспертами Zend Framework. Престижность. Спасибо за то, что поделились этой ссылкой
Rajeev K Tomy
Очень помогите fulll
Амит Бера
1
Да, я думаю, что это правильный ответ. Я даже не удосужился взглянуть на стандарты ZF. Я просто попытался найти логическое объяснение. В свою защиту я заявил в ответ, что это мое мнение.
Мариус