Error: Using $this when not in object context

Aktuell stehe ich total auf dem Schlauch. Will ein kleines Test-Plugin für SW6 erstellen mit einen eigenen Service, eine extra Class wo später weitere Funktionen hinterlegt werden sollen. Soweit geht der Plan auf, allerdings bei der Einbindung von Datenbank Connection scheiter der Spaß.

Error: Using $this when not in object context

Ich weiß nicht wie es zu dieser Fehlermedung kommt. ok, Mein Test sieht wie folgt aus:

TestPluginTool.php

namespace TestPlugin\Util;

use Doctrine\DBAL\Connection;

class TestPluginTool {

  private $systemConfigService;
  private $Connection;

  public function __construct( Connection $Connection )
  {
    $this->Connection = $Connection;
  }

  public function test()
  {
    $result = $this->Connection->..... ????
   }

}

services.xml

  <service id="TestPlugin\Util\TestPluginTool">
  <argument type="service" id="Doctrine\DBAL\Connection"/>
  </service>

In einem eigenen Controller rufe ich dann meine Test-Funktion einfach wie folgt auf:

TestPluginTool::test();

Geht, jedoch mit oben genannten Fehler. Verstehe ich nicht. Ich sehe nicht das Problem :frowning:

Naja du versucht mit TestPluginTool::test() eine statische Methode aufzurufen, die es nicht gibt.

Du müsstest ein Objekt der Klasse TestPluginTool erzeugen und dann die test()-Methode aufrufen.

z. B. $testPluginTool = new …
$testPluginTool->test().

vg

Ah bin ich blöd! Stimmt!

Hm, dann bekomme ich wieder Probleme mit der function __construct(…)

Too few arguments to function TestPlugin\Util\TestPluginTool::__construct()

Versuche mit :

    $TestPluginTool = new TestPluginTool( $this->Connection );
    $TestPluginTool->test();

sehen nicht so schön aus. Ich würde gern die DB Connection erst im TestPluginTool anlegen wollen und nicht übergeben. Ne, irgendwo habe ich noch ein grunsätzliches Problem.

Dein Konstruktor erwartet nun Mal die Connection. Also muss die Übergeben werden.

Du kannst auch „Dependency injection“ benutzen und das TestPluginTool deinem Controller als Argument in der services.xml übergeben.

Ja, ich habe es als Service mit übergeben:

<argument type="service" id="TestPlugin\Util\TestPluginTool"/>

dann sieht die Sache schon besser aus. Somit kann ich zumindest im Controller ggf. auch in einem Subcripter darauf zugreifen. Jetzt knobel ich, wie ich das alles im ScheduledTaskHandler einbinde.