SendDebug in Trait oder anderer Klasse nutzten

Ich würde gerne manche Methoden, die man doch immer wieder nutzt, in einen Trait auslagern. Dabei möchte ich aber dennoch eine Ausgabe im Debug Fenster erzeugen wenn in der Methode etwas nicht funktionieren sollte. Weiterhin würde ich SendDebug auch gerne in Klassen nutzten, die unterhalb von libs liegen und keine Unterklasse von IPSModule darstellen.

Ist das grundsätzlich möglich, wenn ja wie muss der Code aussehen um von einem Trait oder andere Klasse eine Ausgabe ins Debug Fenster zu machen?

Hallo Fonzo,

schau mal hier: IPS-Shelly/ShellyHelper.php at master · Schnittcher/IPS-Shelly · GitHub
Funktioniert wie immer. :wink:

Grüße,
Kai

Vielen Dank für die Info d.h. bei einem Trait geht das wie immer, wie sieht das bei externen Klassen aus? Gibt es da auch eine Möglichkeit etwas im Debug Fenster auszugeben oder muss eine Klasse immer eine Unterklasse von IPSModule sein?

Muss von ipsmodule geerbt werden, sonst funktioniert das nicht.
Ein Grund warum ich auch gerne traits nutze. Aber wir haben jetzt schon die ersten Fehler im Forum gesehen, wo durch die doppelten Trait-Namen es zu Fehlern kommt.
Michael

Wo denn Michael?

Grüße,
Kai

Immer dann wenn du zwei oder mehr Instanzen von verschiedenen Modulen in einem Script ansprichst; wo die Traits der verschiedenen Module den gleichen Namen nutzen.
Michael

Dein BufferHelper zum Beispiel nutze ich auch mit dem selben Namen.
Kann man also nur verhindern, wenn man dort ein Präfix nutzen würde?
Könnte man ja das Präfix vom Modul vorschreiben, oder?

Grüße,
Kai

Ja geht.
Irgendwie aber auch blöd, ich will auf lange Sicht meine Traits Vereinheitlichen und als Submodule einbinden.
Klar, könnte ich jetzt eine eigene Klasse nutzen, welche alle Traits lädt und ipsmodule erbt.
Aber dann Schleife ich immer den ganzen Overhead mit, auch wenn ich z.B. nur einen Traits wie DebugHelper nutzen möchte.
Bin da selber noch unschlüssig wie der beste Weg wäre.
Wenn IPS anstatt nur die PHP-Klasse zu nutzen, auch jedem Modul einen Namespace geben könnte, wäre das eine Lösung.
Michael

Gerade Traits für Buffer, Debug, Variablen etc. wären cool einheitlich als Submodule zu haben. :slight_smile:
Solltest du das tun, könnte sie ja wieder jeder ohne Probleme einbinden, ich würde mich freuen. :slight_smile:

Grüße,
Kai

Ja eben nicht.
Dann knallt es.
Da die Dateien ja unterschiedliche Pfade haben, aber den gleichen Trait-Namen gibt dass dann Fatal-Error :frowning:
Für PHP sind das verschiedene Dateien (auch wenn sie aus dem gleichen Repro kommen).
Michael

Oh, stimmt, gar nicht drüber nachgedacht.

Grüße,
Kai

Du kannst einer verwendeten Klasse einen callback zum Debuggen mitgeben, damit diese darauf zugreifen kann.

Hast Du mal ein Beispiel wie so was auszusehen hat?

Klar:

Klasse mit Debug erhält im Konstruktor den Callback:


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

Klasse in module.php instanziieren und dabei den Callback übergeben:


        $this->object = new DebugClass(
            function ($Message, $Data, $Format) {
                $this->SendDebug($Message, $Data, $Format);
            }
        );

Dann kann innerhalb der DebugClass die Funktion $this->SendDebug wie gewohnt verwendet werden.

Hallo Zusammen,

ich muss nochmal etwas nachfragen zu den traits.

wenn ich in einem Modul einen trait innerhalb eines Moduls include und ein Trait hat z.B. den Namen Notifications … so wird dieser ja Bestandteil des Moduls.


// Include all files in helper folder
include_once __DIR__ . '/helper/autoload.php';

class TestModuleOne extends IPSModule
{
    // Helper
    use Notifications;
.....

Wenn ich in einem weiteren Modul das selbe mache…


// Include all files in helper folder
include_once __DIR__ . '/helper/autoload.php';

class TestModuleTwo extends IPSModule
{
    // Helper
    use Notifications;
.....

im helper Ordner eines jedem Moduls befindet sich die Datei notifications.php mit folgendem Inhalt:


<?php

// Declare
declare(strict_types=1);

trait Notifications
{
    //#################### Notifications
  
    public function Notification(string $Text)
    {
       // do something
    }
}

tritt dann auch der genannte Fehler auf? Es befindet sich ja alles innerhalb des Moduls.

Oder tritt dies auf, wenn es nur einen „globalen“ Trait Notifications gibt und dieser in beiden Modulen verwendet werden soll?

Also bei mir geht es primär nicht um Vererbung, sondern soll für mich zu einem übersichtlicheren Code verhelfen.

Uli

Wenn es der gleiche absolute Dateipfad ist, geht das.
Michael

Ist es, danke Michael.

Gesendet von iPhone mit Tapatalk

Hier zum Beispiel:
[Modul] Tasmota - Seite 84
Michael

Ja, das habe ich auch gelesen. :smiley:
Aber eine Lösung haben wir jetzt noch nicht dafür, oder?

Grüße,
Kai

Ich habe durch etwas externen Input (dank an Paresy) jetzt eine Lösung für mich gefunden.
Ist aber sehr Tricky und man hat schnell einen Knoten im Kopf.
Überlegung ist alle Traits mit einem Namespace zu nutzen.


namespace bvip;

/**
 * DebugHelper ergänzt SendDebug um die Möglichkeit Array und Objekte auszugeben.
 */
trait DebugHelper
{
...


require_once __DIR__ . '/../libs/helper/DebugHelper.php';

class BVIPDiscovery extends IPSModule
{

    use bvip\DebugHelper,
        bvip\BufferHelper;

Da ich aber irgendwann alle gleichen Traits als Submodul für alle meine Module nutzen möchte, sobald der Store dies unterstützt, hat man wieder das gleiche Problem.
Da dann mehrere Dateien mit den gleichen NS\Trait auf dem Dateisystem liegen.

Somit muss beim laden der externen Traits ein individueller Namespace benutzt werden.

/**
 * DebugHelper ergänzt SendDebug um die Möglichkeit Array und Objekte auszugeben.
 */
trait DebugHelper
{
...

eval('namespace bvip {?>' . file_get_contents(__DIR__ . '/../libs/helper/DebugHelper.php') . '}');
eval('namespace bvip {?>' . file_get_contents(__DIR__ . '/../libs/helper/BufferHelper.php') . '}');
class BVIPDiscovery extends IPSModule
{

    use bvip\DebugHelper,
        bvip\BufferHelper;

Das wird dann noch komplizierter, wenn die Traits irgendwo Klassen benutzen. Dann wird versucht die Klasse mit dem NS zu finden.
Oder wenn man weitere Vererbung mit anderen Klassen nutzen. Zum Beispiel wenn vier Module (hier sind Module innerhalb einer Library gemeint) die gleiche Code-Basis einer Basisklasse nutzen sollen, welche wiederum Traits nutzen und von ipsmodule erben muss.

Michael