Neden Magento kontrolörlerinde küçük harf c?


28

Neden cküçük harf controllersklasör adında? Model, Block ve Helper büyük harfle mi başlıyor?


6
Hey ... neden aşağı oy? Bu okunaklı ve aslında iyi bir soru.
Marius

Rastgele işaretleyen / düşüren bir üye var (elbette adını söylemeyeceğim). Örneğin, bu soru saldırgan olarak işaretlendi: D
user487772

@TimBezhashvyly ... evet bunu anlıyorum. Başlangıçta bana saldırgan oldu ama sonra soruyu tekrar okudum :)
Marius

Büyük harf C ile denetleyici zaten haha ​​alındı.
Julien Lachal

Yanıtlar:


28

controllersKlasörlerde bulunan sınıflar özel bir sınıf cinsidir.
Onları, <rewrite>etiketi kullanarak bir modeli veya bir bloğu yeniden yazdığınız gibi yeniden config.xmlyazamazsınız, modeller ( Mage::getModel()) veya yardımcıları ( Mage::helper) veya blokları ( Mage::app()->getLayout()->createBlock()) ile yaptığınız gibi bir fabrika kullanarak bunları başlatamazsınız .
Yani var Mage::getControllerInstance()ama bu biraz farklı. Bunun üzerine daha sonra.
Diğer sınıflar olarak adlandırma kuralına uymadıklarını fark edebilirsiniz.
İş controllers, sınıf adında bulunamadı.
Örneğin bulunan denetleyiciyi ele alalım Mage/Catalog/controllers/CategoryController.php.
Sınıfın adı Mage_Catalog_CategoryController.
Sana% 100 kesin bir cevap veremem, sadece bir çekirdek bunu yapabilir.
Ancak benim varsayım, birisinin denetleyicilerin otomatik yüklenmesini istemediği yönünde.

Bu yönteme bir göz atın Mage_Core_Controller_Varien_Router_Standard::match. Büyük ve korkutucu, ancak bir denetleyiciye bir URL adresi ve bir eylem gösteren budur.
Çok fazla hesaplama yapıldı ama bir yerlerde bu satır var:

$controllerClassName = $this->_validateControllerClassName($realModule, $controller);

Daha derine inersek _validateControllerClassName, sonunda getControllerFileNameşöyle görüneceksin:

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;
}

ve _includeControllerClasso temelde yapar: include $controllerFileName;.

controllersYönteme kodlanmış olan kodu getControllerFileNameve denetleyici dosyasının yeni eklendiğine dikkat edin. Yani otomatik yükleme yok.

Son olarak, denetleyici fabrikası Mage::getControllerInstance()sınıfı bulamaz ve yeniden yazılanlara bakmaz. Sadece kontrolör sınıfının return new $class($request, $response, $invokeArgs);nerede $classolduğunu yapar .

Not : Bazı modüllerde Controller(büyük harf C ile) adlı bir klasör vardır ve standart sınıf isimlerini takip eden sınıflar vardır. Bu sınıflar gerçekten denetleyici değildir. Modüldeki diğer kontrolörler için ebeveyn sınıfları veya yönlendiriciler olarak kullanılırlar.

Yan not 2 : Bu Magento 2'de mevcut değildir. Tüm kontrolörler Controllerklasörde bulunur.


15

Marius çok harikasın: D

Cevabım sadece olurdu:

Bu Zend Framework standardıdır: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html


1
Bu aslında iyi bir cevap.
Marius

1
bu güzel bir cevap. Bence bu Marius'tan daha doğru bir cevap olurdu. Çünkü bir zend framework geliştiricisi, başka bir dizin hakkında düşünmez controllersve Mage çekirdek ekibinin bir zend framework uzmanı olacağını varsayarım. Kudos. Bu bağlantıyı paylaştığınız için teşekkür ederiz
Rajeev K Tomy

Çok yardım fulll
Amit Bera

1
Evet, bunun da doğru cevap olduğunu düşünüyorum. ZF standartlarına bakmak bile zahmet etmedi. Mantıklı bir açıklama bulmaya çalıştım. Savunmamda, cevabın benim fikrim olduğunu belirttim.
Marius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.