为什么在Magento的控制器中c是小写字母?


28

文件夹名称为什么c小写controllers?而Model,Block和Helper以大写字母开头?


6
嘿...为什么要投票?这是一个合法的问题,实际上是一个很好的问题。
马吕斯

有一个成员(我不会告诉您课程的名称)随机地标记/拒绝投票。例如,此问题被标记为具有攻击性:D
user487772 2014年

@TimBezhashvyly ...是的,我明白。一开始它对我来说令人反感,但后来我又读了一个问题:)
马吕斯

拥有大写字母C的控制人已经被任命为哈哈。
Julien Lachal 2014年

Answers:


28

地处中的类controllers文件夹是类的一个特殊的品种。
您不能以与使用中的<rewrite>标记重写模型或块相同的方式来重写它们config.xml,也不能像使用模型(Mage::getModel())或使用助手(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
这是一个很好的答案。我认为这比Marius更为正确。因为zend框架开发人员只会考虑其他目录controllers,所以我认为Mage核心团队将是zend框架专家。荣誉 感谢您分享该链接
Rajeev K Tomy 2014年

非常帮助fulll
阿米特·贝拉

1
是的,我认为这也是正确的答案。我什至不介意看ZF标准。我只是想找到一个合理的解释。为了答辩,我在回答中说这是我的看法。
马吕斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.