В настоящее время меня раздражает написание подобных конструкторов в массовом порядке, как следующие в моих модулях.
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
/* ... */
\Foo\Bar\Model\Baz $baz,
/* ... */
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
$this->registry = $registry;
/* ... */
$this->baz = $baz;
/* ... */
/* some awesome stuff */
}
Во многих, многих случаях мне нужны экземпляры одинаковых классов по всему модулю.
Поэтому я спрашивал себя, будет ли приемлемым способом использовать один или два центральных вспомогательных класса, которые предоставляют необходимые классы, вместо определения их в каждом конструкторе.
Это означает, что шаблон такой:
Хелпер Класс
namespace Foo\Bar\Helper
class Main
{
protected $baz;
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
/* ... */
\Foo\Bar\Model\Baz $baz,
/* ... */
) {
$this->registry = $registry;
/* ... */
$this->baz = $baz;
/* ... */
/* some awesome stuff */
}
public function getBazInstance()
{
return $this->baz;
}
}
Короче конструктор
public function __construct(
\Foo\Bar\Helper\Main $mainHelper,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
$this->mainHelper = $mainHelper;
/* some awesome stuff */
}
На данный момент я не уверен, придется ли мне в будущем иметь дело с большими недостатками, вызванными этой структурой. Будет ли это приемлемым способом уменьшить количество определений DI?
источник
Context
классы - это классы Magento, которые охватывают целые разделы Magento? то есть Категория контекста, поможет управлять добавлением / редактированием / удалением / просмотром категорий без необходимости импорта нескольких классов для выполнения одного и того же действия?\Magento\Catalog\Model\Category
, вы увидите, что он включает в себя то же самое, что\Magento\Framework\Model\Context
я упомянул - на самом деле там нет ничего о категориях. Вы ищете хранилище - посмотрите\Magento\Catalog\Api\CategoryRepositoryInterface
.Я почти уверен, что вы не единственный в этом случае, и в некотором смысле я полностью понимаю, почему вы решили сделать это.
Для меня главная проблема, которую я вижу при таком подходе, заключается в том, что вы теряете одно из главных преимуществ внедрения зависимостей, которое заключается в том, чтобы сразу узнать, от чего зависит ваш класс при проверке конструктора.
Еще одним важным преимуществом Dependency Injection является то, что он облегчает тестирование кода в автоматизированной среде. В вашем случае это определенно один недостаток.
Это две причины, которые возникают, но может быть и больше.
РЕДАКТИРОВАТЬ: Я просто собираюсь добавить цитату от Алана Кента (который является частью Magento), которую вы можете найти в комментариях к этому вопросу :
источник