This article is meant to be a start up point for “newbies” getting ready to digg seriously into the Magetno. When I say newbie’s, I meant no disrespect, I only ment new to Magento. Because, you cannot be newbie PHP developer and do something usefull with Magento since it requires extensive knowledge of OOP and MVC.
Step 1: Init/Run the Magento
File:
/index.phpCode (from line 52):
Mage::run();
Eplanation:
Mage is the class name of the /app/Mage.php file. Mage class is of type final, meaning you cannot extend it. In the code above, we are calling the static method run() on the Mage class.Step 2: Overview of static run() method
File:
/app/Mage.phpCode (from line 447):
public static function run($code = '', $type = 'store', $options=array()){ try { Varien_Profiler::start('mage'); Varien_Profiler::start('mage::app'); self::app($code, $type, $options); Varien_Profiler::stop('mage::app'); Varien_Profiler::start('mage::dispatch'); self::app()->getFrontController()->dispatch(); Varien_Profiler::stop('mage::dispatch'); Varien_Profiler::stop('mage'); } ... /* exception handling code here, irrelevant for this example */}
Explanation:
Inside run() method of Mage class two important things happen at the grand scale of things. Feel free to ignore the Varien_Profiler::start() and Varien_Profiler::stop() at this point since they are irrelevant for this base introductory. Those two important things I mentioned are two method calls insied this run() method, and those are:- self::app($code, $type, $options); /* on line 453 */
- self::app()->getFrontController()->dispatch(); /* on line 457 */
Both of these method calls point us to the same base method, so let’s disect that in next step.
Step 3: Overview of self::app() method
File:
/app/Mage.phpCode (from line 416):
public static function app($code = '', $type = 'store', $options=array()){ if (null === self::$_app) { Varien_Profiler::start('mage::app::construct'); self::$_app = new Mage_Core_Model_App(); Varien_Profiler::stop('mage::app::construct'); Mage::setRoot(); Mage::register('events', new Varien_Event_Collection()); Varien_Profiler::start('mage::app::register_config'); Mage::register('config', new Mage_Core_Model_Config()); Varien_Profiler::stop('mage::app::register_config'); Varien_Profiler::start('mage::app::init'); self::$_app->init($code, $type, $options); Varien_Profiler::stop('mage::app::init'); self::$_app->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS); } return self::$_app;}
Explanation:
Inside app() method we have several essentials things happening. Try to ignore the Varien_Profiler::start() and Varien_Profiler::stop() stuff. Now let’s review the code. First we have self::$_app = new Mage_Core_Model_App() called, saying store me and instace of Mage_Core_Model_App into my local (from the point of view of Mage class) $_app variable.Note the definition of app() method, it’s app($code = ”, $type = ‘store’, $options=array()). It receives three main parameters (or none, in which case it uses defaults). Anyhow, this method call sets up entire object of type Mage_Core_Model_App and stores it in Mage class local variable $_app.
Then we have three method calls, one after other setting up page Mage class object:
- Mage::setRoot();
- Mage::register(‘events’, new Varien_Event_Collection());
- Mage::register(‘config’, new Mage_Core_Model_Config());
After which we are pointed back to our Mage_Core_Model_App object instance by following method calls:
- self::$_app->init($code, $type, $options);
- self::$_app->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
Note that self::$_app is storing the instace of Mage_Core_Model_App so it’s perfectly ok to call any public method that Mage_Core_Model_App class has on this variable.
I will not go into the details of what both of those method calls do, since this article would take hours and hours to be written in such a way to cover all the inner workings details.
For now, let’s just remember the return type of app() method call, return self::$_app, it’s the instance of Mage_Core_Model_App class. In short, app() method sets up and returns entire App model.
Now, let’s have a look back to step 2. There is one more method call left to be covered, we’ll do that in step 4
Step 4: Overview of self::app()->getFrontController()->dispatch()
File:
/app/code/core/Mage/Core/Model/App.phpCode (from line 857):
public function getFrontController(){ if (!$this->_frontController) { $this->_initFrontController(); } return $this->_frontController;}
Explanation:
Mage_Core_Model_App class is all about setting currently running application instance options. Method call getFrontController() returns the result of the private Mage_Core_Model_App method called _initFrontController().While the _initFrontController() calls and sets $this->_frontController = new Mage_Core_Controller_Varien_Front(), where $this variable is in context of Mage_Core_Model_App class, it returns $this, or in short, it returns current instace of Mage_Core_Model_App class.
Since self::app()->getFrontController() method call returned us and object instance of type Mage_Core_Model_App we are allowed to chain a method dispatch() to it. Since this is the last method call inside run() method of a Mage class file, this makes it a full circle.
Keep in mind that this is really, really, really the most basic intro to Magento’s init process. There are a ton of stuff that happen upon each method call in this process and I only covered the most basic one. For instance, when you called the self::app() you “triggered chained” calls of many methods that might call other classes and methods essential to build a instance of Mage_Core_Model_App. Not to mention the inheritance and so on.
I find it a pencil and a piece of paper to be a good tools for tracking and “drawing” yourself Magento application inner workings. Core things are really massive, a lot of file are involved into the Magento init process and lover core inner workings. It gets easy to loose track of things jumping from one class to another.