Ankündigung

Einklappen
Keine Ankündigung bisher.

flourish fActiveRecord fehlerhaft?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • flourish fActiveRecord fehlerhaft?

    Hallo,

    auf empfehlung habe ich mir mal das Framework flourish angesehen.
    (http://flourishlib.com)

    Nun versuche ich gerade meine eigene Base-Model-Klasse drumrum zu basteln.
    Problem:
    Meine Column-Names sind _immer_ UPPERCASE, dies sollte auch so bleiben.

    Laut Doku kann man mit
    Code:
    \fORM::overrideColumnName($fActiveRecordObject_or_className, $name, $myName)
    die Default-Tabellen-Namen überschreiben, wenn man wie ich andere Namen nutzt als alles lowercase und was weiß ich wie verarbeitet.

    Code:
    public function fakeColumnNamesForORM($tableName, $schema) {
    	foreach ($schema as $column) {
    		\fORM::overrideColumnName($tableName, $column, strtoupper($column));
    	}
    }
    $tableName ist der von fORM erwartete Klassenname, in $schema stehen die Column-Names drinne, wie ich sie von diesem geliefert bekommen sollte.

    Nun treten folgende Fehler auf:
    Lade ich ein Objekt
    Code:
    $objekt = new Version(1);
    wirft er eine Notice aus:
    Code:
    Undefined index: id in <b>C:\php\cms\core\flourishFramework\fActiveRecord.php</b> on line <b>1958</b>
    Die Column-Names sind die richtigen.
    Rufe ich nun aber bspw. "setVersion(1)" auf, so schickt er den Column-Name dennoch lowercase an seine set-Methode.
    Code:
    public function set($column, $value) {
    	parent::set(strtoupper($column), $value);
    }
    Hilft in diesem Fall.

    Habe ich ein neues Objekt geladen (also den Konstruktor ohne Parameter aufgerufen), stimmt das Casing wiederum nicht, alle Tabellen sind lowercase geladen.
    So kann ich dann natürlich nicht mehr mit meinem "set-Fix" alles überschreiben.

    Kennt sich wer genug mit dem Teil aus, um mir damit ein wenig zu helfen?


    Neue Instanz ohne Parameter erzeugt:
    Code:
    object(Version)#1 (5) {
      ["_mapperKey":protected]=>
      string(7) "version"
      ["cache":protected]=>
      array(0) {
      }
      ["old_values":protected]=>
      array(0) {
      }
      ["related_records":protected]=>
      array(0) {
      }
      ["values":protected]=>
      array(4) {
        ["version"]=>
        NULL
        ["created_at"]=>
        NULL
        ["last_modified_at"]=>
        NULL
        ["id"]=>
        NULL
      }
    }
    Neue Instanz mit Parameter erzeugt (Parameter 1):
    Code:
    <br />
    <b>Notice</b>:  Undefined index: id in <b>C:\php\cms\core\flourishFramework\fActiveRecord.php</b> on line <b>1958</b><br />
    object(Version)#1 (5) {
      ["_mapperKey":protected]=>
      string(7) "version"
      ["cache":protected]=>
      array(0) {
      }
      ["old_values":protected]=>
      array(0) {
      }
      ["related_records":protected]=>
      array(0) {
      }
      ["values":protected]=>
      array(5) {
        ["id"]=>
        NULL
        ["VERSION"]=>
        string(1) "0"
        ["CREATED_AT"]=>
        object(fTimestamp)#28 (2) {
          ["timestamp":protected]=>
          int(1406566877)
          ["timezone":protected]=>
          string(13) "Europe/Berlin"
        }
        ["LAST_MODIFIED_AT"]=>
        object(fTimestamp)#27 (2) {
          ["timestamp":protected]=>
          int(1406566877)
          ["timezone":protected]=>
          string(13) "Europe/Berlin"
        }
        ["ID"]=>
        string(1) "1"
      }
    }

  • #2
    - Warum verwendest du uppercase Spaltennamen? Du solltest ja jetzt gemerkt haben, dass das nicht die übliche Praxis ist.
    - Das du mit "new Version(1)" ein neues Objekt erstellst ist ganz nett, nachdem wir den Konstruktor dazu aber nicht sehen, können wir auch nicht wissen welche Properties du da setzt.
    - Wo und wann rufst du denn deine fakeColumnNamesForORM() auf?
    - ...

    Zusammengefasst: Mich wundert es wenig, dass das nicht klappt und ich frage mich warum das so umständlich lösen möchtest.

    Kommentar


    • #3
      Meine Models erben von BaseModel, welches wiederum von fActiveRecord erbt.

      Die Parameter werden normal durchgereicht, "new Version(1)" lädt also das Element mit der id 1.
      fakeColumnNames wird vor instanziieren des fActiveRecord-Objekts aufgerufen, da ich seperat bereits die Columns auslese und prüfe, ob alle da sind, die ich haben will (ID, Createt at und Last Modified At).

      Danach wird fActiveRecord instanziiert und damit von flourish das (evtl. nun korrigierte) Schema analysiert. Dort berücksichtigt er nun aber nicht an jeder Stelle die hinterlegten ColumnNames.


      Ich überlege weniger was hier die Regel ist - die Column-Names wurden vor ewigkeiten so festgesetzt und ich müsste allen Code neu anpassen. Vielmehr wundert es mich das eine entsprechende Funktion angeboten wird, diese aber nicht richtig zu arbeiten scheint. Oder ich nutze sie falsch...

      [edit]
      Ich habe jetzt die DB-Spalten angepasst... zwar ungern, aber naja. Dennoch würde mich interessieren ob ich da irgendwo einfach nur was vergessen hab oder so...

      Kommentar


      • #4
        PHP-Code:
        \fORM::overrideColumnName($tableName$columnstrtoupper($column)); 
        PHP-Code:
        /**
             * Allows overriding of default column names
             *
             * By default a column name is the result of fGrammar::humanize() called
             * on the column.
             *
             * @param  mixed  $class        The class name or instance of the class the column is located in
             * @param  string $column       The database column
             * @param  string $column_name  The name for the column
             * @return void
             */
            
        static public function overrideColumnName($class$column$column_name
        Hast du hier dann nicht die Reihenfolge der Parameter vertauscht? Wenn ich dich richtig verstanden haben sind die Spalten ja in der DB uppercase, und du willst im Code lowercase verwenden. Zumindest wenn ich die Doku hier richtig verstehe.

        Kommentar


        • #5
          Zitat von Kagu-chan Beitrag anzeigen
          Hallo,

          auf empfehlung habe ich mir mal das Framework flourish angesehen.
          (http://flourishlib.com)
          Dann war die Empfehlung bescheiden gesagt beschissen. Das framework wird weder weiterentwickelt noch supported wie es aussieht. Außerdem ist der Code einfach schlecht und gängige Dinge wie ein vernünftig durchdactes Namespac-System fehlen komplett.

          Lösung: Wechsel das Framework.
          Wenn du was schlankes suchst, kannst du dir mal Silex ansehen. Wenn du alles haben möchtest, schau dir mal Symfony oder Laravel an. Den ORM (ActiveRecord Implementierung) von Laravel (Eloquent) finde ich recht gut: http://laravel.com/docs/eloquent Ich glaube du kannst sogar deine Spaltennamen großschreiben (auch wenn das gegen alle Konventionen ist)

          Kommentar

          Lädt...
          X