文件夹名称为什么c
小写controllers
?而Model,Block和Helper以大写字母开头?
文件夹名称为什么c
小写controllers
?而Model,Block和Helper以大写字母开头?
Answers:
地处中的类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
文件夹中。
马里乌斯,你是如此出色:D
我的回答是:
这是Zend Framework标准:http : //framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
controllers
,所以我认为Mage核心团队将是zend框架专家。荣誉 感谢您分享该链接