Mengapa c
huruf kecil dalam controllers
nama folder? Sedangkan Model, Block, dan Helper mulai dengan huruf besar?
Mengapa c
huruf kecil dalam controllers
nama folder? Sedangkan Model, Block, dan Helper mulai dengan huruf besar?
Jawaban:
Kelas-kelas yang terletak di controllers
folder 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 controllers
tidak 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 _validateControllerClassName
Anda akan berakhir getControllerFileName
seperti 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 _includeControllerClass
yang pada dasarnya melakukan hal ini: include $controllerFileName;
.
Perhatikan hard coded controllers
dalam metode ini getControllerFileName
dan 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 $class
kelas 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 Controller
folder.
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
controllers
dan saya menganggap tim inti Mage akan menjadi pakar kerangka kerja zend. Pujian. Terima kasih telah berbagi tautan itu