Magento의 컨트롤러에서 c가 소문자 인 이유는 무엇입니까? 폴더 이름 이 c소문자

폴더 이름 이 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


답변