Чому c - малі регістри в контролерах Magento?


28

Чому cв controllersназві папки є малі літери ? Тоді як модель, блок і помічник починаються з великої літери?


6
Гей ... чому потік? Це законний і насправді гарний питання.
Маріус

Є член (я не скажу ім'я курсу), який позначає / відхиляє довільно. Наприклад, це питання було
визнано

@TimBezhashvyly ... так, я це розумію. На початку це стало для мене образливим, але потім я знову прочитав питання :)
Маріус

Контролер з великою літерою С вже взяли ха-ха.
Жульєн Лашал

Відповіді:


28

Класи, розташовані в 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папці.


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. Я просто намагався знайти логічне пояснення. На свій захист я заявив у відповіді, що це моя думка.
Маріус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.