Contextualizando
O que é ORM?
ORM (Object-Relational Mapping) é uma técnica de mapeamento de objeto-relacional que visa criar uma camada de mapeamento entre o modelo de objetos da aplicação para o modelo relacional do banco de dados, de forma a abstrair o acesso ao mesmo, ou seja, é uma técnica de mapeamento entre um modelo de dados relacional e um modelo orientado a objetos que geralmente é a biblioteca ou framework que ajuda no mapeamento e uso do banco de dados. a ORM visa resolver, ou pelo menos minimizar, as diferenças entres estes dois modelos.
A ORM é uma biblioteca que é escrita para encapsular o código necessário para manipular os dados, para que não seja necessário utilizar o SQL no código da programação orientada a objetos.
O Magento 2 não tem todos os recursos normalmente oferecidos por uma ORM, ele possui apenas uma abstração sobre consultas por linhas do SQL (Resource Model).
Quando usar as classes Model, Resource Model e Collection?
As classes de Model, Resource Model e Collection estendem classes que fazem o mapeamento entre a abstração da entidade e o modelo relacional do banco de dados.
Estas classes servem para o gerenciamento de dados em uma tabela personalizada, ou seja, as classes são para operações de dados no modelo CRUD (Create, Read, Update e Delete) de uma única tabela. Saiba como criar uma tabela personalizada no post "Como criar tabelas personalizadas no banco de dados com db_schema.xml no Magento 2".
Código para a criação da Model, Resource Model e Collection
Model
A classes Model é responsável por diversas funções, como as regras de negócio de uma aplicação, encapsular dados do seu negócio, acessar, extrair e manipular dados das entidades. O termo Model vêm do padrão de arquitetura MVC (Model-Controller-View).
A classe Model deve seguir a estrutura de pastas \{Vendor}\{Module}\Model\{ModelName}
e deve estender a classe \Magento\Framework\Model\AbstractModel
, que necessita que a classe a implemente o método _construct()
. A classe Model herdará a classe \Magento\Framework\DataObject
para seus objetos.
<?php namespace {Vendor}\{Module}\Model; use Magento\Framework\Model\AbstractModel; use Magento\Framework\Model\Context; use Magento\Framework\Registry; use {Vendor}\{Module}\Model\ResourceModel\{ResourceModelName}; class {ModelName} extends AbstractModel { protected $_cacheTag = '{table_name}'; protected $_eventPrefix = '{table_name}'; public function __construct( Context $context, Registry $registry ) { parent::__construct($context, $registry); } protected function _construct(): void { $this->_init({ResourceModelName}::class); } }
-
$_cacheTag
: um identificador único para uso de cache; -
$_eventPrefix
: um prefixo para eventos a serem disparados;
Caso a classe de modelo esteja tratando de uma entidade, é recomendado utilizar a seguinte interface \Magento\Framework\DataObject\IdentityInterface
ou implementar uma interface personalizada da sua entidade com todos os métodos requisitados da entidade em questão.
Resource Model
A classe Resource Model é responsável pela execução de todas as operações no banco de dados, além de mapear uma entidade em uma tabela. Esta classe executa todas as operações de CRUD e é responsável pela lógica de negócio.
A classe Resource Model deve seguir a estrutura de pastas \{Vendor}\{Module}\Model\ResourceModel\{ResourceModelName}
e deve estender a classe abstrata \Magento\Framework\Model\ResourceModel\Db\AbstractDb
, que contém os métodos para buscar informações do banco de dados e requisita a implementação do método _construct()
.
<?php namespace {Vendor}\{Module}\Model\ResourceModel; use Magento\Framework\Model\ResourceModel\Db\AbstractDb; use Magento\Framework\Model\ResourceModel\Db\Context; class {ResourceModelName} extends AbstractDb { public function __construct( Context $context ) { parent::__construct($context); } protected function _construct(): void { $this->_init('{table_name}', '{entity_column_id}'); } }
Collection
A classe Collection é considerada a Resource Model que permite filtrar e buscar os dados de uma tabela de uma coleção da entidade, ou seja, uma coleção de objetos que possibilita o filtro, agrupamento, ordenação e carregamento de uma determinada entidade, array ou a própria coleção.
A classe Collection deve seguir a estrutura de pastas \{Vendor}\{Module}\Model\ResourceModel\{EntityName}\{CollectionName}
e deve estender a classe abstrata \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
, que contém os métodos para tratar dos dados da coleção da entidade e requisita a implementação do método _construct()
. A classe Collection instanciará a classe \Magento\Framework\Data\Collection
para seus objetos de retorno da entidade.
É possível unir dados de outras tabelas em uma Collection com o join()
para serem executados no banco de dados.
<?php namespace {Vendor}\{Module}\Model\ResourceModel\{EntityName}; use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; use Magento\Framework\Data\Collection\EntityFactoryInterface; use Psr\Log\LoggerInterface; use Magento\Framework\Data\Collection\Db\FetchStrategyInterface; use Magento\Framework\Event\ManagerInterface; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\Model\ResourceModel\Db\AbstractDb; use {Vendor}\{Module}\Model\{ModelName}; use {Vendor}\{Module}\Model\ResourceModel\{ResourceModelName}; class {CollectionName} extends AbstractCollection { protected $_idFieldName = '{entity_column_id}'; protected $_eventPrefix = '{table_name}_collection'; protected $_eventObject = '{table_name}_collection'; public function __construct( EntityFactoryInterface $entityFactory, LoggerInterface $logger, FetchStrategyInterface $fetchStrategy, ManagerInterface $eventManager, AdapterInterface $connection = null, AbstractDb $resource = null ) { parent::__construct( $entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource ); } protected function _construct(): void { $this->_init( {ModelName}::class, {ResourceModelName}::class ); } }
-
$_idFieldName
: campo identificador para a coleção de itens; -
$_eventPrefix
: nome do prefixo do evento que são disparados pela Model; -
$_eventObject
: nome do parâmetro do evento.
Finalizando
Valores entre chaves (
{test}
) devem ser alterados na implementação do código.
Habilitando o alterações
Gera a configuração das injeções de dependência e todas as classes ausentes.
# Gera a configuração das injeções de dependência e todas as classes ausentes. php bin/magento setup:di:compile # Limpa o armazenamento (cache) de todos os processos do Magento php bin/magento cache:flush
Diretórios e Arquivos
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/ - code/ - {Vendor}/ - {Module}/ - etc/ - db_schema.xml - module.xml - Model/ - {EntityName}.php - ResourceModel/ - {EntityName}.php - {EntityName}/ - Collection.php - registration.php - composer.json
Top comments (0)