Zugriff auf shopware_storefront.context_service außerhalb Controller

Schönen Abend,

Ich möchte Artikeldaten auslesen und dazu das SearchBundle Service nutzen. Ich habe hierzu in einer Klasse (die über ein Plugin instanziert wird) folgende Zeilen lt. Dokumentation verfasst:

 $criteria = new Criteria(); $context = Shopware()-\>Container()-\>get('shopware\_storefront.context\_service')-\>getProductContext(); 

Das führt zu folgender Exception:

[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]
  You have requested a non-existent service „shop“. Did you mean one of these: „shopware.plugin.config_reader“, „shopware.plugin.cached_config_reader“, …

Ich habe leider keine Ahnung wie er darauf kommt, dass ich hier ein Service names „Shop“ nutzen möchte!? Hat es vielleicht damit zu tun, dass ich den DI Container nicht aus dem Controller heraus sondern über das Application-Object Shopware() nütze?

Danke für jeden Tipp & schönen Abend,

Michael

Hallo,

ich weiß nicht, ob das noch aktuell ist, aber wenn Du im Plugin Kontext bist, also in Deiner Bootstrap.php oder in Deiner 5.2 genamespacten Basis Klasse, dann kannst Du doch einfach den Container nutzen:

$this->container->get('shopware_storefront.context_service');
// oder kuerzer (macht intern das selbe wie oben):
$this->get('shopware_storefront.context_service');

Über das Container Pattern habe ich bisher jeden Shopware() Aufruf eleminiert.

PS: Bin gerade per Google auf Deinen Beitrag gestoßen, weil ich ein ähnliches Problem habe…

@wolkenkraft schrieb:

Ich habe leider keine Ahnung wie er darauf kommt, dass ich hier ein Service names „Shop“ nutzen möchte!? Hat es vielleicht damit zu tun, dass ich den DI Container nicht aus dem Controller heraus sondern über das Application-Object Shopware() nütze?

Das liegt daran, dass der context service den Service shop benötigt. Ob der Container dir bereits im Controller zur verfügung steht oder du ihn dir selbst über Shopware()->Container() holst ist dabei egal, das ist eh der selbe Container.

Ich vermute, dass du deine Klasse im Backend oder in der CLI nutzt, dort wird (im Gegensatz zum Frontend) kein Shop automatisch geladen. Wenn du einen benötigst musst du das selbst tun:

$repository = Shopware()->Container()->get('models')->getRepository('Shopware\Models\Shop\Shop');
$shop = $repository->getActiveById(1);
$shop->registerResources();

Bei getActiveById die Id des jeweiligen Shops einfügen den du nutzen willst. Wenn du nur einen hast kannst du alternativ auch getActiveDefault() nutzen.