Perché c è minuscolo nei controller di Magento?


28

Perché il nome della cartella è cminuscolo controllers? Mentre Model, Block e Helper iniziano con una lettera maiuscola?


6
Ehi ... perché il downvote? Questa è una domanda legittima e davvero buona.
Marius

C'è un membro (non dirò il nome ovviamente) che sta segnalando / effettuando il downvoting in modo casuale. Ad esempio, questa domanda è stata contrassegnata come offensiva: D
user487772

@TimBezhashvyly ... sì, lo capisco. Mi è sembrato offensivo all'inizio, ma poi ho letto di nuovo la domanda :)
Marius

Il controller con la C maiuscola era già stato preso ahah.
Julien Lachal,

Risposte:


28

Le classi che si trovano nelle controllerscartelle sono una speciale classe di classi.
Non puoi riscriverli nello stesso modo in cui riscrivi un modello o un blocco usando il <rewrite>tag in config.xml, non puoi istanziarli usando una fabbrica come fai per i modelli ( Mage::getModel()) o con gli helper ( Mage::helper) o con i blocchi ( Mage::app()->getLayout()->createBlock()).
Voglio dire che c'è Mage::getControllerInstance()ma è un po 'diverso. Più su questo più tardi.
Potresti notare che in realtà non seguono la regola di denominazione come le altre classi.
L'opera controllersnon si trova nel nome della classe.
Prendiamo ad esempio il controller trovato in Mage/Catalog/controllers/CategoryController.php.
Il nome della classe è Mage_Catalog_CategoryController.
Non posso darti una risposta certa al 100%, solo un core sviluppatore può farlo.
Ma la mia ipotesi è che qualcuno non voleva che i controller fossero caricati automaticamente.

Dai un'occhiata a questo metodo Mage_Core_Controller_Varien_Router_Standard::match. È grande e spaventoso, ma è quello che associa un url a un controller e un'azione.
Ci sono molti calcoli fatti ma da qualche parte c'è questa linea:

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

Se scaviamo più a fondo, finirai _validateControllerClassNamein getControllerFileNamequesto aspetto:

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

e _includeControllerClassche, in fondo fa questo: include $controllerFileName;.

Notare il codice hard controllersnel metodo getControllerFileNamee notare che il file del controller è appena incluso. Quindi nessun caricamento automatico.

Infine, il controller factory Mage::getControllerInstance()non trova la classe e non guarda nelle riscritture. Fa solo return new $class($request, $response, $invokeArgs);dov'è $classla classe del controller.

Nota a margine : in alcuni moduli è presente una cartella denominata Controller(con maiuscola C) e le classi in seguono la denominazione di classe standard. Quelle classi non sono realmente controller. Sono utilizzati come classi principali per altri controller nel modulo o come router.

Nota a margine 2 : questo non esiste in Magento 2. Tutti i controller si trovano nella Controllercartella.


15

Marius sei così grande: D

La mia risposta sarebbe stata:

Questo è lo standard Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html


1
In realtà è una buona risposta.
Marius

1
questa è una bella risposta Penso che questa sarebbe una risposta più corretta di Marius. Perché uno sviluppatore del framework zend non penserebbe a un'altra directory oltre a controllerse suppongo che il core team di Mage sarebbe un esperto del framework zend. Complimenti. Grazie per aver condiviso quel link
Rajeev K Tomy il

Molto aiuto completo
Amit Bera

1
Sì, penso che anche questa sia la risposta corretta. Non mi sono nemmeno preoccupato di guardare gli standard ZF. Ho appena provato a trovare una spiegazione logica. A mia difesa, nella risposta ho affermato che era la mia opinione.
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.