Create Basic Module of Magento 2


Before I dig into coding parts of our first Module development using Magento 2:-
Let me add some input into this direction that will further help us to understand further .

Couple of things about Magento 2

  1. Magento 2 is not based on MVC

Magento 2 is not based on MVC (Model View Controller) pattern. Instead its based on MVVM (Model Veiw View Model) model. Lets understand the different between MVC and MVVM (Model View View Model) .

In Magento 1, Based on the URL request it calls corresponding controller and action name. For example if url is . Based on the URL name it was automatically invoking account controller and register action under it.

Now this is not the case in Magento 2, Now every controller has one execute method that gets called. Now, instead of multiple action name under one controller , now only one execute method for each controller so if there are 10 actions to be moved in magento 2 then, 10 different controller to be created.

  1. There is no code pool in Magento 2. All code is written into app/code/Module/Code

Lets deep dive into our first module development

The name of this module would be Cutehits_First.Where Cutehits is the Module’s company name and First is the name of the module.

To start into development, just Create a folder under app/code/<namespace>/<modulename>. For example app/code/Cutehits/First

This module development has been distributed into four parts:

Part 1: Creating module configuration
Part 2: Registering module
Part 3: Create module Routing
Part 4: Creating controller

Part 1: Creating module configuration

Now create a folder etc and create a file module.xml under it. See the content of Cutehits\First\etc\module.xml.

<?xml version="1.0"?>

<config xmlns:xsi="" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">

    <module name="Cutehits_First" setup_version="1.0.0">



Code Analysis Part 1

Note: The only important part under this code is

<module name="Cutehits_First" setup_version="1.0.0">    </module>

Rest is boilerplate code. There are only 2 parts to understand

  • name -> Name of <namespace>_<modulename>
  • setup_version -> if there is any db setup with your extension to be deployed

Part 2: Registering module

Now create a file under <namespace>\<modulename>\registration.php. see the content of Cutehits\First\registration.php






Code Analysis Part 2
The important part of above snippet is <namespace>_<modulename> remaining is boilerplate code.

Part 3: Create module Routing

The next important part is routers. create a file routes.xml. See the content of Cutehits\First\etc\frontend\routes.xml

<config xmlns:xsi="" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">

    <router id="standard">

        <route id="first" frontName="first">

            <module name="Cutehits_First" />




Code Analysis Part 3

<route id=”first” frontName=”first”>

<module name=”Cutehits_First” />


This part is important to understand.

Every route has a unique id and has their unique frontname. In our case first is the front name. The next part is moduel name that shows which module handles the route.

Part 4: Creating controller

The next important part is controller:

Here its notable that in Magento 2 every action has their own controller if its written that <module name=”Cutehits_First” /> . It means no controller name is defined. In this case default controller name is Index controller. Ideal format is <module name=”namespace_modulename_Controllername” />

So lets create folder path like <namespace>\<modulename>\Controller\Index\Index.php

See the code of Cutehits\First\Controller\Index\Index.php

namespace Cutehits\First\Controller\Index;

class Index extends \Magento\Framework\App\Action\Action

 public function execute()

 echo "Hello World...";

Code Analysis Part 4
namespace Cutehits\First\Controller\Index; :- We have created a new namespace name that can further be utilized

use Magento\Framework\App\Action\Context; :- consuming the namespace, see trait.


Now created a class named Index and created a protected variable $_resultPageFactory so that we can consume it in any child class.

now constructor comes with 2 arguements (see dependency injection).

Next important part is execute method . Every controller action class has a method execute that actually gets called by the magento 2.

So we have just written ‘Hello world ‘ there.

Related posts:

The following two tabs change content below.

Chandra Shekhar

Consultant at Infogain
Chandra Shekhar is a LAMP Developer,Thinker,Blogger and currently working as Magento(Ecommerce) specialist.. I am always open to learn new things in LAMP as well as other newer technology. In the journey of my last 9 years of web and product development, I have decided to share my knowledge and experience to Open Source Community in 2011. In this regard I have started Since then I am actively sharing my knowledge on various LAMP technology through’s technical ... Read More about Chandra Shekhar

Latest posts by Chandra Shekhar (see all)