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.