Почему автоматически созданные фабрики не расширяют и не реализуют какие-либо классы (интерфейсы)


Это более абстрактный вопрос, чем конкретная проблема.

Почему автоматически создаваемые фабрики в magento не реализуют какой-либо общий интерфейс?

И что беспокоит меня, может быть, больше. Почему автоматически созданные фабрики не расширяют друг друга, чтобы их можно было правильно передавать в качестве аргументов.


Например. У меня есть class MagicClass. Затем я создаю класс class MoreMagicClass extends MagicClass.

По моему мнению, автоматически сгенерированный MoreMagicClassFactory должен расширяться MagicClassFactory.

Итак когда у меня будет другой класс с конструктором, который выглядит так __construct(MagicClassFactory $magicClassFactory), я мог бы также передать фабрику чайлдса.

Я хотел бы сделать это в качестве запроса функции, но я подозреваю, что есть веская причина, по которой автоматически созданные фабрики ведут себя не так, как мне бы хотелось.

Итак, есть ли причина?


ИЗМЕНИТЬ:

Я сделал запрос на функцию на официальном форуме Magento.

Author: michalhosna, 2017-03-16

2 answers

Добавление к ответу Мариуса когда вы смотрите на эти автоматически сгенерированные коды фабрик, это всегда только вызов \Magento\Framework\ObjectManagerInterface::create(). Больше в этом ничего нет. Если бы они расширяли друг друга до некоторой абстрактной фабрики, это означало бы, что эти автоматически сгенерированные классы были бы полностью пустыми или имели бы одно свойство с именем класса для создания экземпляра.

Вы также можете посмотреть код, который в настоящее время генерирует заводские классы, он находится в Magento\Framework\ObjectManager\Code\Generator\Factory. Добавление родительских классов там потребует некоторых дополнительных сложностей, таких как вам либо придется генерировать их рекурсивно, что может быть опасно, так как в php может быть установлен xdebug с максимальным уровнем вложенности. Если не рекурсивно, то вы сгенерируете код для класса Childfactory, а при попытке загрузить его снова отправитесь в генератор кода, чтобы сгенерировать код для ParentFactory и так далее. Поскольку классы magento, как правило, имеют большую родословную, я подозреваю, что этот процесс заметно расширит di:compile. В производственном режиме это будет делаться только время от времени при обновлении сервера, но в процессе разработки, когда вы работаете над кодом и вам часто приходится восстанавливать эти классы, это может быть болью в заднице для уже замедленной системы.

В целом применение наследования к автоматически созданным фабрикам не принесло бы большой пользы при значительно больших затратах на это.

 4
Author: Zefiryn, 2017-03-16 21:18:28

Я не вижу никаких причин для того, чтобы фабрики связанных классов были связаны сами по себе.
Фабрика имеет только одну область применения. Создайте другие экземпляры.
MagicClassFactory создает экземпляры MagicClass и MoreMagicClassFactory создает экземпляры MoreMagicClass.
Они не должны знать больше о классах, которые они создают. Их не должно волновать, связаны ли классы каким-то образом.

Для реализации интерфейса я не уверен в этом. Может быть, для всех них имеет смысл реализовать FactoryInterface или что-то в этом роде как это. У меня нет окончательного ответа/мнения по этому поводу.

Но, кроме того, если вам по какой-то причине не нравится автоматически созданная фабрика, вы можете создать свою собственную, соответствующую вашим потребностям.
Фабрики автоматически генерируются только в том случае, если класс не существует.
Поэтому, если у вас есть класс MagicClassFactory, написанный вами, Magento не будет автоматически генерировать его в var/generation.

 3
Author: Marius, 2020-02-14 04:48:23