폴더 이름 이 c
소문자 인 이유는 무엇 controllers
입니까? Model, Block 및 Helper는 대문자로 시작하는 반면?
답변
에 위치한 클래스 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