He leído un par de tutoriales en Magento 2, y esto me confunde un poco. Puedo ver que básicamente hay dos formas en que podemos leer / escribir entidades comerciales:
Recuperar datos
Usando un enfoque de fábrica
$object = $this->myFactory->create();
$object->load($myId);
Usando un enfoque de repositorio
$repo = $this->myRepository();
$object = $repo->getById($myId);
Guardar datos
Usando un enfoque de fábrica
$object = $this->myFactory->create();
$object->load($myId);
$object->setData('something', 'somethingDifferent')->save();
Usando un enfoque de repositorio
$repo = $this->myRepository();
$object = $repo->getById($myId);
$object->setData('something', 'somethingDifferent');
$repo->save($object);
También puedo ver que, tanto un repositorio como una clase de fábrica se pueden inyectar usando inyección de dependencia. Esto es confuso al menos para mí.
¿Cuándo debemos usar un enfoque de repositorio y un enfoque de fábrica? ¿Cuál es la mejor práctica que debemos seguir?
magento2
best-practice
factory
repository
Rajeev K Tomy
fuente
fuente
Respuestas:
Si hay un repositorio y hace lo que necesita bien, siempre prefiera el repositorio.
Los repositorios son parte de los contratos de servicio (son implementaciones de interfaces
Api
), esto significa que están destinados como una interfaz pública para otros módulos.Utilice los repositorios para la carga completa
$model->load()
no es parte del contrato de servicio. Tenía una pregunta sobre ese tema en particular, podría encontrar útiles las respuestas: ¿Hay alguna razón para preferir $ model-> load () sobre los contratos de servicio?Usa Fábricas para crear nuevas entidades
Los repositorios no incluyen métodos para crear una nueva entidad, por lo que necesitará una fábrica. Pero use la fábrica para la interfaz , como por ejemplo
Magento\Catalog\Api\Data\ProductInterfaceFactory
: creará la implementación correcta basada en la configuración DI.Luego use el
repository->save()
método para guardarlo.Use las Fábricas de colecciones si necesita más control
La siguiente no es la mejor práctica oficial de Magento, pero actualmente, los repositorios no le dan un control preciso sobre qué cargar. La API de criterios de búsqueda le permite definir filtros, pero, por ejemplo, no hay forma de seleccionar atributos EAV particulares o especificar a qué tablas de índice unirse.
Estos son detalles de implementación, ocultos de las API del contrato de servicio, pero a menudo estos detalles de implementación son importantes y obtiene un rendimiento deficiente si los ignora. Por esa razón, tan pronto como los repositorios me limitan, ya no dudo en usar las colecciones subyacentes.
fuente
use the factory for the interface, such as Magento\Catalog\Api\Data\ProductInterfaceFactory - it will create the right implementation based on DI configuration.
es el punto que no puedo entender, las guías de desarrollo no presentan InterfaceFactory , ¿cómo usar elrepository->save()
método para guardar nuevas entidades? Solo puedo usar la fábrica para guardar nuevas entidades, no el repositorio.Buena pregunta.
Incluso si tanto los repositorios como las fábricas nos permiten acceder a una entidad, creo que deberíamos centrarnos en su responsabilidad .
De la documentación de Magento : "Las fábricas son clases de servicio que instancian clases no inyectables, es decir, modelos que representan una entidad de base de datos. Crean una capa de abstracción entre el ObjectManager y el código comercial".
Del artículo de Alan Storm : "Un objeto de repositorio es responsable de leer y escribir la información de su objeto en un almacén de objetos"
Mi interpretación es: si nuestro propósito es trabajar con objetos no inyectables (llamados "renovables"), deberíamos usar Fábricas; Si nuestro foco está en buscar / leer / escribir objetos dentro de un almacén de objetos, deberíamos usar repositorios.
Este es mi enfoque idealista del tema; tenga en cuenta que la implementación real puede obligarnos a estropear las cosas, como señaló Alan.
Disfrutar.
fuente
Diría que el camino a seguir es comenzar a usar repositorios ya que permiten la separación de código entre la lectura / escritura de datos y la lógica empresarial.
Hay un artículo muy detallado escrito por Alan Storm sobre esto, que explica cómo usar los repositorios, pero también analiza algunos inconvenientes de este nuevo método: http://alanstorm.com/magento_2_understanding_object_repositories/
Además, de la documentación de Magento, que explica los beneficios de este nuevo enfoque: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.html
fuente
$setup->updateTableRow(...);
o fábricas de instalación / actualización , no estoy seguro, pero parece que los argumentos para usar el nivel superior también se aplican a esa área, ¿qué piensas?Espero que esta respuesta también pueda ayudar a otros desarrolladores de extensiones.
Para guardar el modelo, use siempre el Repositorio para guardar cualquier entidad, si el modelo de fábrica se usa para guardar el modelo, elimina todos los atributos eav que no sean del sistema relacionados con esa entidad (cliente, producto, etc.).
Para cargar el propósito del modelo, el repositorio es la mejor opción para obtener el modelo usando el método getById ().
fuente
Ahora los métodos de carga, guardado y eliminación (modelos) están en desuso, por lo que podemos usar el modelo o repositorio de recursos.
Magento ahora utiliza el concepto de administrador de entidades para operaciones de guardar, eliminar y cargar.
Los modelos de recursos tienen un objeto administrador de entidad para cumplir con esas operaciones.
fuente