Magento 2 – Tutorial : new model – Part 2 – creating the PHP classes
Introduction
This article is the 2nd part of a series in which I go through the procedure to create a new model in magento 2, with its own magento 2 admin grid in the Back Office.
You can go back to the first part if you wish.
As a preamble, I have to say that this tutorial series has been developed and tested with Magento version 2.4.2.
I remind you that for the purpose of the article I am going to create a "provider" model and that our code will be contained in an "Addeos_ModelTutorial" module.
In the first part I have explained how to create the DB table using declarative XML. In this second part, I will create the PHP classes :
- the API data interface
- the model that implements the interface
- the resource model
- the collection resource model
Creating the API data interface
If we want to respect the concept of service contracts which is a good thing and recommanded by Magento, I need to create some PHP interfaces first. Here is some more details about service contracts.
By convention, these PHP interfaces have to be in an Api folder and a Data folder for data interfaces.
The first interface to create is the ProviderInterface : Api/Data/ProviderInterface.php
.
Here is the code :
<?php declare(strict_types=1); namespace Addeos\ModelTutorial\Api\Data; /** * @api */ interface ProviderInterface { const ENTITY_ID = 'entity_id'; const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; const NAME = 'name'; const DESCRIPTION = 'description'; public function getEntityId(): ?int; public function setEntityId(int $entityId); public function getName(): ?string; public function setName(string $name); public function getDescription(): ?string; public function setDescription(string $description); public function getCreatedAt(): ?string; public function setCreatedAt(string $createdAt); public function getUpdatedAt(): ?string; public function setUpdatedAt(string $updatedAt); }
Creating the PHP model
I then need to create the PHP model that will implement the interface we have just created. This PHP class will extend \Magento\Framework\Model\AbstractModel
.
Here is the code :
<?php declare(strict_types=1); namespace Addeos\ModelTutorial\Model; use Addeos\ModelTutorial\Api\Data\ProviderInterface; use Magento\Framework\Model\AbstractModel; class Provider extends AbstractModel implements ProviderInterface { public function getName(): ?string { return $this->getData(self::NAME); } public function setName(string $name) { $this->setData(self::NAME, $name); } public function getDescription(): ?string { return $this->getData(self::DESCRIPTION); } public function setDescription(string $description) { $this->setData(self::DESCRIPTION, $description); } public function getCreatedAt(): ?string { return $this->getData(self::CREATED_AT); } public function setCreatedAt(string $createdAt) { $this->setData(self::CREATED_AT, $createdAt); } public function getUpdatedAt(): ?string { return $this->getData(self::CREATED_AT); } public function setUpdatedAt(string $updatedAt) { $this->setData(self::UPDATED_AT, $updatedAt); } }
Creating the resource model
I now need to create resource model.
The file is Model/ResourceModel/Provider.php
.
Here is the code :
<?php declare(strict_types=1); namespace Addeos\ModelTutorial\Model\ResourceModel; use Magento\Framework\Model\ResourceModel\Db\AbstractDb; class Provider extends AbstractDb { protected function _construct() { $this->_init('addeos_provider', 'entity_id'); } }
Creating the collection resource model
I now need to create the provider collection resource model.
The file is ModelResourceModel/Provider/Collection.php
.
Her is the code :
<?php namespace Addeos\ModelTutorial\Model\ResourceModel\Provider; use Addeos\ModelTutorial\Model\Provider; use Addeos\ModelTutorial\Model\ResourceModel\Provider as ProviderResourceModel; use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; class Collection extends AbstractCollection { protected $_idFieldName = 'entity_id'; protected $_eventPrefix = 'addeos_provider_collection'; protected $_eventObject = 'addeos_provider_collection'; protected function _construct() { $this->_init(Provider::class, ProviderResourceModel::class); } }
And that's all. From that point we have all the necessary classes for now.
In next post, I will explain now how to create the grid in Back Office to visualize the data of our new table.