Mengapa c huruf kecil di dalam pengontrol Magento?

28

Mengapa churuf kecil dalam controllersnama folder? Sedangkan Model, Block, dan Helper mulai dengan huruf besar?

Muthu
sumber
6
Hei ... mengapa downvote? Ini pertanyaan yang sah dan sebenarnya bagus.
Marius
Ada anggota (saya tidak akan memberi tahu nama tentu saja) yang menandai / downvoting secara acak. Misalnya pertanyaan ini ditandai sebagai ofensif: D
user487772
@TimBezhashvyly ... ya saya mengerti itu. Awalnya terasa menyinggung saya, tetapi kemudian saya membaca pertanyaan itu lagi :)
Marius
Kontroler dengan huruf C sudah diambil haha.
Julien Lachal

Jawaban:

28

Kelas-kelas yang terletak di controllersfolder adalah jenis kelas khusus.
Anda tidak dapat menulis ulang mereka dengan cara yang sama seperti Anda menulis ulang model atau blok menggunakan <rewrite>tag config.xml, Anda tidak dapat instantiate mereka menggunakan pabrik seperti yang Anda lakukan untuk model ( Mage::getModel()) atau dengan helpers ( Mage::helper) atau dengan blockers ( Mage::app()->getLayout()->createBlock()).
Maksud saya ada Mage::getControllerInstance()tapi itu sedikit berbeda. Lebih lanjut tentang ini nanti.
Anda mungkin memperhatikan bahwa mereka tidak benar-benar mengikuti aturan penamaan sebagai kelas lainnya.
Karya controllerstidak ditemukan dalam nama kelas.
Mari kita ambil contoh controller yang ditemukan di Mage/Catalog/controllers/CategoryController.php.
Nama kelasnya adalah Mage_Catalog_CategoryController.
Saya tidak bisa memberi Anda jawaban 100% pasti, hanya pengembang inti yang bisa melakukannya.
Tetapi asumsi saya adalah bahwa seseorang tidak ingin pengendali di-autoload.

Lihatlah metode ini Mage_Core_Controller_Varien_Router_Standard::match. Ini besar dan menakutkan, tapi itu yang memetakan url ke controller dan tindakan.
Ada banyak perhitungan yang dilakukan tetapi di suatu tempat ada baris ini:

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

Jika kami menggali lebih dalam _validateControllerClassNameAnda akan berakhir getControllerFileNameseperti ini:

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

dan dalam _includeControllerClassyang pada dasarnya melakukan hal ini: include $controllerFileName;.

Perhatikan hard coded controllersdalam metode ini getControllerFileNamedan perhatikan bahwa file controller baru saja dimasukkan. Jadi tidak ada autoloading.

Akhirnya, pabrik pengontrol Mage::getControllerInstance()tidak menemukan kelas dan tidak melihat dalam penulisan ulang. Itu hanya di return new $class($request, $response, $invokeArgs);mana $classkelas controller.

Catatan : Di beberapa modul ada folder bernama Controller(dengan huruf besar C) dan kelas-kelas di ikuti penamaan kelas standar. Kelas-kelas itu bukan pengendali. Mereka digunakan sebagai kelas induk untuk pengontrol lain dalam modul atau sebagai router.

Catatan sisi 2 : Ini tidak ada di Magento 2. Semua pengontrol berada di Controllerfolder.

Marius
sumber
15

Marius kamu hebat sekali: D

Jawaban saya adalah:

Ini adalah standar Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html

Fabian Blechschmidt
sumber
1
Ini sebenarnya jawaban yang bagus.
Marius
1
ini jawaban yang indah. Saya pikir ini akan menjadi jawaban yang lebih benar daripada Marius. Karena pengembang kerangka kerja zend tidak akan memikirkan direktori lain selain controllersdan saya menganggap tim inti Mage akan menjadi pakar kerangka kerja zend. Pujian. Terima kasih telah berbagi tautan itu
Rajeev K Tomy
Sangat membantu penuh
Amit Bera
1
Yap saya pikir ini adalah jawaban yang benar juga. Saya bahkan tidak repot-repot melihat standar ZF. Saya hanya mencoba mencari penjelasan yang logis. Dalam pembelaan saya, saya menyatakan dalam jawaban bahwa itu adalah pendapat saya.
Marius