Переваги заводу Magento2 у порівнянні з Magento 1


15

Magento 2 використовує заводські класи для неін'єкційних препаратів.

Наприклад клас товару: ProductFactory
наприклад клас клієнта:CustomerFactory

Я не розумію, який тут тип заводських моделей ?

Тому що для кожного класу, пов’язаного з 1 заводським класом. Я думаю, що це щось дублює. Чому ми не повинні створювати абстрактну фабрику CustomerFactory, і ProductFactoryт.д.?

а також, наприклад:

Ми можемо передати AbstractFactoryдля перевірки типу замість ProductFactoryв ProductRepositoryконструкторі класу.

Таким чином, ми можемо уникнути щільної зв'язку між ProductRepositoryіProductFactory


Абстрактний заводський клас:

namespace Magento\Framework\ObjectManager\Code\Generator;

/**
 * Abstract Factory class 
 */
abstract class AbstractFactory 
{
    /**
     * Object Manager instance
     *
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $_objectManager = null;

    /**
     * Instance name to create
     *
     * @var string
     */
    protected $_instanceName = null;


    /**
     * Create class instance with specified parameters
     *
     * @param array $data
     * @return \Magento\Catalog\Model\Product
     */
    public function create(array $data = array())
    {
        return $this->_objectManager->create($this->_instanceName, $data);
    }
}

Реалізація абстрактних заводів:

namespace Magento\Catalog\Model;
use Magento\Framework\ObjectManager\Code\Generator\AbstractFactory;
/**
 * Factory class for @see \Magento\Catalog\Model\Product
 */
class ProductFactory extends AbstractFactory
{

    public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager, $instanceName = '\\Magento\\Catalog\\Model\\Product')
    {

        $this->_objectManager = $objectManager;
        $this->_instanceName = $instanceName;
    }

}

Яке співвідношення між менеджером об’єктів та фабрикою?

Є стільки ланцюжкових предметів:

  • Наприклад ProductRepository(тут ми можемо називати це клієнтом) потрібен Productоб'єкт.

  • Для цього це залежить від конкретного ProductFactoryоб'єкта.

  • ProductFactoryоб'єкт залежить від ObjectManagerоб'єкта.

  • ObjectManagerОб'єкт залежить від заводського об'єкта (тут Developer Object).

Звичайно, вони використовують інтерфейси для вільної зв'язку. Все ще дійсно заплутаний потік.

Чи можете ви комусь надати поглиблені переваги із заводською схемою Magento 2, а також чим вона відрізняється від Magento 1?

Відповіді:


8

Варто пам’ятати, що ми автоматично генеруємо фабричні класи ТОЛЬКО, АКО ВИ НЕ ВИЗНАЧИТИ ОДИН ВАС. Це означає, що якщо вам потрібно зробити якусь особливу магію на заводі, ви можете це зробити. (Наприклад, якщо ви хочете записати кожне створення екземпляра з якихось причин, напишіть фабрику самостійно, і ми не створимо її автоматично.) Якщо б ми використовували один абстрактний заводський клас для всього цього, це не буде працювати.

Це також може трохи допомогти з налагодженням - ви можете побачити реальний клас, можете встановити точки прориву, побачити більш значущі сліди стека і т.д.


може бути невеликий розрив .. для перевірки типу я хочу використовувати абстрактний клас .. але щоразу, коли проходить, я хочу пройти тільки конкретний заводський клас
sivakumar

Цікаво - я б вважав навпаки. Я хотів би, щоб CustomerFactory передався, тому я маю натяк на тип, що create () поверне Клієнта. З AbstractFactory я не можу використовувати підказку типу php Storm для опрацювання типу повернутого об'єкта з заводу. (Або я щось пропускаю?)
Алан Кент

8

Я можу помилитися тут, але я знайшов цю перевагу.
Автоматично створені фабрики дещо схожі з магічними геттерами або сетерами.
Скажімо, ви хочете, щоб щось сталося, коли створюється екземпляр конкретної сутності (назвемо це BlogPost). Скажімо, ви хочете встановити значення поля за замовчуванням для поля.
Приклад може бути не найкращим, але вислухайте мене.
Якщо ви використовуєте абстрактний завод, вам доведеться його змінити так, що коли ви отримаєте instanceName як параметр "BlogPost", який ви викликаєте setDateпісля ініціації .

Якщо ви використовуєте автогенеровану фабрику, згодом ви можете створити цю фабрику, зателефонувати setterу свій код, видалити створений завод і він спрацює.
Аналогічно тому, що ви робите з магічним сетером. Ви реалізуєте метод, і він називається скрізь.


Вітаю, Marius! Дякуємо, що ваш answer.agree з вами. Все ще потрібна додаткова інформація.
sivakumar

@sivakumar. Я також хотів би відповісти від основного члена команди.
Маріус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.