Zu diesem Zeitpunkt ärgere ich mich darüber, in meinen Modulen massenhaft ähnliche Konstruktoren wie die folgenden zu schreiben.
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 */
}
In vielen, vielen Fällen benötige ich überall in meinem Modul Instanzen derselben Klassen.
Ich fragte mich also, ob es akzeptabel wäre, eine oder zwei zentrale Hilfsklassen zu verwenden, die die erforderlichen Klassen bereitstellen, anstatt sie in jedem einzelnen Konstruktor zu definieren.
Dies bedeutet ein Muster wie dieses:
Helferklasse
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;
}
}
Der kürzere Konstruktor
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 */
}
Zum jetzigen Zeitpunkt bin ich mir nicht sicher, ob ich mich in Zukunft mit großen Nachteilen aus dieser Struktur auseinandersetzen muss. Wäre dies ein akzeptabler Weg, um die Anzahl der DI-Definitionen zu reduzieren?
quelle
Context
Klassen Magento-Klassen, die ganze Abschnitte von Magento umfassen? Wird der Kategoriekontext dabei helfen, das Hinzufügen / Bearbeiten / Entfernen / Anzeigen von Kategorien zu verwalten, ohne dass mehrere Klassen importiert werden müssen, um dieselbe Aktion auszuführen?\Magento\Catalog\Model\Category
, werden Sie feststellen, dass es dasselbe enthält, das\Magento\Framework\Model\Context
ich erwähnt habe - es gibt eigentlich überhaupt nichts über Kategorien. Sie suchen ein Repository - schauen Sie sich das an\Magento\Catalog\Api\CategoryRepositoryInterface
.Ich bin mir ziemlich sicher, dass Sie in diesem Fall nicht der einzige sind, und irgendwie verstehe ich vollkommen, warum Sie darüber nachgedacht haben.
Für mich ist das Hauptproblem, das ich bei einem solchen Ansatz sehe, dass Sie einen der Hauptvorteile von Dependency Injection verlieren, nämlich sofort zu wissen, wovon Ihre Klasse abhängt, wenn Sie den Konstruktor überprüfen.
Ein weiterer wichtiger Vorteil von Dependency Injection besteht darin, dass das Testen von Code in einem automatisierten Framework einfacher wird. In Ihrem Fall ist das definitiv ein Nachteil.
Das sind die beiden Gründe, die auftauchen, aber es kann noch mehr geben.
EDIT: Ich werde nur ein Zitat von Alan Kent (der Teil von Magento ist) hinzufügen, das Sie in den Kommentaren dieser Frage finden können :
quelle