Funktionieren Merkmale tatsächlich mit der Abhängigkeitsinjektion in Magento? Betrachten Sie den folgenden Code:
Merkmalsklasse
namespace Frame\Slick\Block;
use Frame\Slider\Slick\Block\Data as Helper
trait Slick
{
protected $_slickHelper;
public function __construct(Helper $slickHelper)
{
$this->_slickHelper = $slickHelper;
}
}
Klasse mit dem Merkmal
namespace Frame\Slick\Block;
class Product ListProduct implements BlockInterface
{
use Slick;
public function testTrait()
{
return $this->_slickHelper->getHelloWorld();
}
}
Dies scheint immer null zurückzugeben, ich bin mir sehr sicher, dass alles richtig aufgenommen wird. Kann das Merkmal die Abhängigkeitsinjektion wirklich unterstützen?
BEARBEITEN: Wenn Sie beispielsweise im Trait-Konstruktor ein di ausführen und es einer Trait-Variablen zuweisen und es dann für die Klasse aufrufen, die das Trait verwendet, wird immer null zurückgegeben. Alles andere funktioniert gut.
Antworten:
Ich habe mit Merkmal getestet und es funktioniert gut.
So sieht mein Merkmal aus:
Ich benutze es in Controller wie folgt:
Und hier ist das Ergebnis:
quelle
Ich habe mich nur selbst damit konfrontiert. Der ursprüngliche Beitrag ist ziemlich alt, daher können die Dinge jetzt anders sein als zu dem Zeitpunkt, als er veröffentlicht wurde. Ich habe jedoch festgestellt, dass der Konstruktor DI zwar funktioniert, aber eine ziemlich große Einschränkung aufweist.
Wenn ich das folgende Merkmal in meinem Code verwende:
und fahren Sie dann fort, dieses Merkmal in einer Klasse zu verwenden:
Die Logger-Schnittstelle ist perfekt injiziert und alles funktioniert einwandfrei. JEDOCH, wenn ich meine eigenen Klassen mit der Konstruktormethode in meine Service-Klasse einfügen möchte. Z.B:
In diesem Fall wird die Konstruktormethode meines Merkmals niemals aufgerufen, was bedeutet, dass die Eigenschaft $ logger meiner Klasse niemals festgelegt wird. Zugegeben, ich habe nicht viel Merkmale verwendet, so dass mein Wissen etwas begrenzt ist, aber ich gehe davon aus, dass dies daran liegt, dass meine Klasse die Konstruktormethode meines Merkmals überschrieben hat. Dies ist so ziemlich ein Show-Stopper, da der Großteil der Magento-Codebasis Konstruktoren verwendet, um Abhängigkeiten zu injizieren, wodurch deren Verwendung in Merkmalen effektiv ausgeschlossen wird.
Die einzige wirkliche Lösung, die ich dafür sehen kann, besteht darin, den ObjectManager direkt zu verwenden, um Ihre Merkmalsabhängigkeiten zu injizieren:
Haftungsausschluss: Von der Verwendung von ObjectManager in Magento wird im Allgemeinen abgeraten, aber soweit ich in diesem Fall sehen kann, ist dies die einzige echte Option. Wenn Sie in meinem Beispiel eine andere Logger-Schnittstelle in Ihrer Klasse festlegen möchten, können Sie dies dennoch tun, indem Sie sie in Ihren Konstruktor einfügen und die Eigenschaft class $ logger überschreiben.
quelle
__construct
, eine aus dem Merkmal importierte und die andere in der Klasse selbst. Sie können jedoch nicht zwei Methoden mit demselben Namen in einer Klasse haben. Im Grunde genommen wird in Ihrem Fall__construct
das Merkmal__construct
in der Klasse selbst überschrieben .