# Datensätze persistieren außerhalb vom Plugin-Kontext

**URL:** <https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475>\
**Category:** Programmierung\
**Created:** [7. August 2018 um 11:58 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475 "2018-08-07T11:58:01Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![eMod](https://avatars.discourse-cdn.com/v4/letter/e/e495f1/32.png) [@eMod](https://forum.shopware.com/u/eMod)\
**Post date:** [7. August 2018 um 11:58 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/1 "2018-08-07T11:58:01Z")

</div>

Hallo,

ich versuche vergebens via eigenem Plugin innerhalb eines Cronjobs einen Datensatz zu speichern.  
Das Problem hier scheint zu sein, dass es ausserhalb der Plugin-Klasse passieren muss.

In meiner Plugin-Klasse (die die Shopware Plugin Klasse extended) kann ich denn EntityManager aufrufen und somit Queries generieren.  
Z.B. so:

```
public function insertDemoData() {
   
   /** @var ModelManager $entityManager */
   $entityManager = $this->container->get('models');

   $someCustomObj = new CustomObject();
   $someCustomObj ->setTitle('new title');
   $someCustomObj ->setDescription('this is a new description');

   $entityManager->persist($someCustomObj);
   $entityManager->flush($someCustomObj);
}

```

Wie wäre das entsprechende Vorgehen in einer Klasse, die nicht von der Shopware Plugin-Klasse erbt ?

Hier erhalte ich bisher immer nur die Fehlermeldung, dass die Funktion get() nicht auf NULL ausgeführt werden kann, da das ‘container’-Attribute hier nicht zur Verfügung steht.

Leider bin ich noch nicht allzu fit was das Theme Doctrine angeht,

Daher würde ich mich über eine Anregung bzgl. der Lösung des Problems sehr freuen.

Danke im Vorraus.

Shopware-Version: 5.4.6

---

<div class="post-metadata">

**Author:** ![BestShopPossible](https://avatars.discourse-cdn.com/v4/letter/b/6bbea6/32.png) [@BestShopPossible](https://forum.shopware.com/u/BestShopPossible)\
**Post date:** [7. August 2018 um 12:39 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/2 "2018-08-07T12:39:11Z")

</div>

Noch nie gemacht. Sollte aber so wie hier beschrieben gehen:

[https://developers.shopware.com/developers-guide/plugin-quick-start/#plugin-cronjob](https://developers.shopware.com/developers-guide/plugin-quick-start/#plugin-cronjob)

---

<div class="post-metadata">

**Author:** ![eMod](https://avatars.discourse-cdn.com/v4/letter/e/e495f1/32.png) [@eMod](https://forum.shopware.com/u/eMod)\
**Post date:** [7. August 2018 um 12:56 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/3 "2018-08-07T12:56:28Z")

</div>

Hi,

Danke schonmal für die Antwort.

Das Problem hier besteht jedoch darin, dass der „Container“ in der Cronjob-Klasse NULL ist, da dieser soweit mir ersichtlich in der Klasse&nbsp; **Shopware\Components\Plugin&nbsp;** initialisiert wird.

Fehler:  
PHP Fatal error: &nbsp;Call to a member function get() on null in /…/shopware/custom/plugins/MyPlugin/Subscriber/Cronjob.php

Somit scheint das&nbsp;in der Doku beschriebene Vorgehen im Cron-Kontext nicht zu funktionieren.  
Dieser implementiert lediglich folgende Klasse&nbsp; **\Enlight\Event\SubscriberInterface&nbsp;**

---

<div class="post-metadata">

**Author:** ![BestShopPossible](https://avatars.discourse-cdn.com/v4/letter/b/6bbea6/32.png) [@BestShopPossible](https://forum.shopware.com/u/BestShopPossible)\
**Post date:** [7. August 2018 um 13:09 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/4 "2018-08-07T13:09:52Z")

</div>

Hä?&nbsp;

Unter Resources eine cronjob.xml anlegen und ähnlich wie dort befüllen. Im Beispiel wird auf einen bestehender Cronjob subscribed. Du willst ja einen eigenen erstellen. Also deinen eigenen Cronjob erstellen.&nbsp;

Ansonsten hat mich google direkt im ersten Ergebnis mal hierdrauf gestoßen:

> <https://gist.github.com/shyim/51ffba2719d5223c65fa6917b94f8a1e>

---

<div class="post-metadata">

**Author:** ![eMod](https://avatars.discourse-cdn.com/v4/letter/e/e495f1/32.png) [@eMod](https://forum.shopware.com/u/eMod)\
**Post date:** [7. August 2018 um 13:24 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/5 "2018-08-07T13:24:10Z")

</div>

Die cronjob.xml existiert bereits und die Cronjob-Klasse ebenfalls.  
Der Cronjob lässt sich auch über die Console ausführen.

Scheinbar ist mein Problem nicht ganz deutlich geworden… in dem Beispiel, das du mir geschickt hast, wird die Plugin Klasse extended.  
Das würde ich vorzugsweise umgehen wollen. Jedoch auch wenn ich nach diesem Beispiel vorgehe und den Cronjob via Konsole ausführe, erhalte ich die selbe Fehlermeldung.

Mittlerweile glaube ich, dass das eigentliche Problem die Ausführung des Cronjobs ist und notwendige Klassen im Kontext der Konsole (Command siehe unten) einfach nicht verfügbar sind bzw. nicht berücksichtigt werden.

Command:  
php bin/console sw:cron:run Shopware\_CronJob\_MyPluginAction -f

&nbsp;

&nbsp;

---

<div class="post-metadata">

**Author:** ![BestShopPossible](https://avatars.discourse-cdn.com/v4/letter/b/6bbea6/32.png) [@BestShopPossible](https://forum.shopware.com/u/BestShopPossible)\
**Post date:** [7. August 2018 um 14:04 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/6 "2018-08-07T14:04:26Z")

</div>

Hmm, ok, dann bin ich wieder hier:

> Noch nie gemacht.

sry, viel Glück ;)&nbsp;

---

<div class="post-metadata">

**Author:** ![simkli](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/simkli/32/13124_2.png) [@simkli](https://forum.shopware.com/u/simkli)\
**Post date:** [7. August 2018 um 15:02 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/7 "2018-08-07T15:02:53Z")

</div>

Naja du hast ja eine Subscriber-Klasse (DeineKlasse extends EventSubscriber). Diese wird ja über die service.xml registriert. Hier kannst du ja via DependencyInjection den ModelManager direkt in den Konstruktor übergeben.

Viele Grüße

---

<div class="post-metadata">

**Author:** ![eMod](https://avatars.discourse-cdn.com/v4/letter/e/e495f1/32.png) [@eMod](https://forum.shopware.com/u/eMod)\
**Post date:** [7. August 2018 um 15:23 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/8 "2018-08-07T15:23:33Z")

</div>

Naja zumindest in der Theorie ^^

Also folgendes wäre hier mein Setup:

services.xml:

Und die Cronjob.php:

```
 'customAction'
        ];
    }

    /**
     * @param \Shopware_Components_Cron_CronJob $job
     * @return bool
     * @throws \Exception
     */
    public function customAction(\Shopware_Components_Cron_CronJob $job) {
 
        /* persist stuff */
        
        $customObj = new customObject();
        $customObj->setTitle('custom title');
        $customObj->setDescription('custom description');

        /** @var ModelManager $entityManager */
        $entityManager = $this->container->get('models');

        $entityManager->persist($customObj);
        $entityManager->flush($customObj);
        
        return true;
    }

}

?>

```

Der Cronjob lässt sich wie gesagt via Console ausführen.  
Und hier extende ich bereits die Plugin-Klasse (weil es wohl anders nicht geht 😕 ?!).  
Und trotzdem ist $this-\>container immer NULL und somit die get() function unbrauchbar.

---

<div class="post-metadata">

**Author:** ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)\
**Post date:** [7. August 2018 um 15:36 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/9 "2018-08-07T15:36:56Z")

</div>

Du musst das SubscriberInterface implementieren

Hier nen Beispiel:

Klasse:&nbsp;[FroshProfiler/VarDumpCollectorSubscriber.php at master · FriendsOfShopware/FroshProfiler · GitHub](https://github.com/FriendsOfShopware/FroshProfiler/blob/master/Subscriber/VarDumpCollectorSubscriber.php#L10)

Hier die Definition&nbsp;[FroshProfiler/var\_dump.xml at master · FriendsOfShopware/FroshProfiler · GitHub](https://github.com/FriendsOfShopware/FroshProfiler/blob/master/Resources/services/var_dump.xml#L74)

---

<div class="post-metadata">

**Author:** ![simkli](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/simkli/32/13124_2.png) [@simkli](https://forum.shopware.com/u/simkli)\
**Post date:** [7. August 2018 um 15:40 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/10 "2018-08-07T15:40:32Z")

</div>

Ich glaube dir fehlt hier etwas OOP Verständnis. 😉

1. Wieso erbt dein CronJob von der Klasse Plugin. Die Datei liegt im Namespace Subscriber. Das ist nicht die Hauptpluginklasse.  
Richtig wäre: Keine Vererbung. Lediglich ein _implements SubscriberInterface_

2. Wenn du den Container via DI übergibst, brauchst du einen Konstruktur und musst diesen auch in einer Instanzvariable ablegen. Danach kannst du nun mit $this-\>container darauf zugreifen

&nbsp;

Viele Grüße

---

<div class="post-metadata">

**Author:** ![eMod](https://avatars.discourse-cdn.com/v4/letter/e/e495f1/32.png) [@eMod](https://forum.shopware.com/u/eMod)\
**Post date:** [8. August 2018 um 06:33 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/11 "2018-08-08T06:33:28Z")

</div>

Hey,&nbsp;  
ich werde das gleich mal soweit testen. Schonmal vielen Dank&nbsp;für deine Mühen.  
Ich glaube bei mir hapert es aktuell eher (noch) an Shopware Verständnis&nbsp; ![Wink](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/b3785da0cbf2c8566cb535dcf55b2730b5224899.png "Wink").  
OOP ist nicht das Problem ^^

Der Versuch mit der Vererbung der Plugin-Klasse basierte hier nur darauf, dass diese  
innerhalb meines Plugins der einzige “Ort” war&nbsp;an dem ein Persistieren möglich war,&nbsp;  
aufgrund der Verfügbarkeit der&nbsp;Container-Variable&nbsp;und damit des EntityManagers.  
Dass diese auch über eine Dependency-Injection verfügbar gemacht&nbsp;werden können&nbsp;  
war mir halt nicht bewusst.

Nevertheless… werde es im Laufe des Tages testen und Rückmeldung geben.

---

<div class="post-metadata">

**Author:** ![eMod](https://avatars.discourse-cdn.com/v4/letter/e/e495f1/32.png) [@eMod](https://forum.shopware.com/u/eMod)\
**Post date:** [8. August 2018 um 07:14 UTC](https://forum.shopware.com/t/datensatze-persistieren-ausserhalb-vom-plugin-kontext/54475/12 "2018-08-08T07:14:17Z")

</div>

Ja sauber, klappt soweit …

Noch als kleiner Nachtrag… vor meinem Versuch mit dem Extenden der Plugin-Klasse hatte ich das SubcriberInterface sogar implementiert.  
Was in meinem Fall jedoch gefehlt hat war folgende Klasse:

```
Shopware\Components\DependencyInjection\Container;

```

Dann **mal wieder** Muchas Gracias an simkli&nbsp; ![Thumb-Up](https://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/thumb-up.png "Thumb-Up")
