Soy consciente de que Magento 2 introdujo modelos de datos como parte de la arquitectura del contrato de servicio. Los modelos de datos generalmente implementan interfaces definidas en Api / Data / de un módulo.
Pero, Magento parece haber conservado los viejos modelos también.
Tomemos un ejemplo de módulo-cliente.
- Interfaz del modelo de datos definida en Api / Data / CustomerInterface.php
- La interfaz anterior se implementa en Model / Data / Customer.php
- El modelo de datos tiene todas las funciones getter y setter para las variables del cliente, como cabría esperar.
- Además de lo anterior, también hay un Model / Customer.php. Esto también tiene la función getter y setter. Esto se parece más a un modelo de Magento 1 que se conecta al ResourceModel (Model / ResourceModel / Customer.php)
- En Model / ResourceModel / CustomerRepository.php, varias funciones recopilan datos del modelo Magnento 1, los transfieren al modelo de datos y luego devuelven el modelo de datos.
¿Por qué se necesita el viejo modelo? ¿Por qué el modelo de datos no puede conectarse directamente con ResourceModel?
fuente
\Magento\Customer\Api\Data\CustomerInterface
están expuestos para la API REST / SOAP (si está habilitada). Sin embargo, no necesita un modelo de datos para seleccionar qué métodos están expuestos, ya que simplemente puede conectar la interfaz al modelo 'real'. Así se hace\Magento\Catalog\Model\Product
y\Magento\Catalog\Api\Data\ProductInterface
Agregando a la respuesta @ Phoenix128_RiccardoT, vale la pena notar que los repositorios (es decir,
MagentoCms\Api\BlockRepository
oMagento\Customer\Api\CustomerRepositoryInterface
) también esperan que proporcione un modelo de datos y no uno regular. Los modelos de datos son una capa de abstracción sobre los modelos estándar que expone solo los datos proporcionados por la entidad. Todas las "acciones" sobre estos datos se mueven a otra parte.Se parece un poco a la idea de entidad en Symfony2 y Symfony3 donde las entidades contienen solo datos y cualquier manipulación de datos está teniendo lugar en el administrador de entidades. En Magento2, este papel, creo, se le dio a los repositorios.
Los modelos antiguos todavía están con nosotros porque se desarrolló magento2. Evidentemente, no comenzaron desde index.php en blanco, sino que reutilizaron parte del código de M1. Cuando se echa un vistazo a los métodos normalizados (
load()
,save()
ydelete()
) todos se marcan comodeprecated
. Esto se debe a que el trabajo se mueve a los repositorios (dado que en algunos casos todo el repositorio ahora llama a estesave()
método de modelo regular , pero el camino me parece claro).fuente
Los modelos encapsulan la lógica comercial independiente del almacenamiento, no conocen los motores o las instancias de la base de datos, en Magento 2, los modelos de datos son objetos de transferencia de datos (DTO), implementación de las interfaces específicas de DTO (modelo de datos) para los modelos Magento CRUD (el modelo ) determina qué métodos de clase están disponibles a través de Magento WebAPI.
Model/Data/Customer.php
determina qué métodos están disponibles para la API, mientras queModel/Customer.php
tiene una implementación de tipo Magento 1 heredada de getters y setters personalizados disponibles para operaciones que no son API.Model/ResourceModel/CustomerRepository.php
es parte de una nueva característica introducida en Magento 2 - Contratos de servicio, funciona con la combinación de DTO (Modelos de datos).Como sabemos que Magento ORM consiste en modelos, modelos de recursos y colecciones y depende de la base de datos, el propósito de un contrato de servicio es ocultar la lógica de almacenamiento para que un cliente conectado al repositorio (contrato de servicio) no se preocupe por el almacenamiento de destino motor.
fuente