Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Framework-API sollte das Setzen von internen Felder (d.h. von Feldern, die vom Framework selbst verwaltet werden) nicht erlauben #303

Open
j3nsch opened this issue Aug 22, 2022 · 1 comment

Comments

@j3nsch
Copy link
Member

j3nsch commented Aug 22, 2022

Aktuell bietet die Framework-API die Möglichkeit interne Felder von außen zu setzen, z.B. ServerState{Created,Published,Modified,Deleted}. Das sollte unterbunden werden, da sonst möglicherweise inkonsistente Zustände provoziert werden können.

Daher hatten wir gerade am Telefon folgende Idee: die Felder können bis zum ersten Aufruf der Methode store() geändert werden. Anschließend hat nur noch das Framework darauf Zugriff.

Thoralfs Idee dazu:

  • in der Klasse Opus_Model_Abstract eine Methode aufnehmen
    public function protectField($fieldname) {
      $this->_internalFields[] = $fieldname;
    }
  • Nun scheitert folgender Aufruf:
    opus> $d = new Opus_Document();
    opus> $d->setServerDatePublished('2011-11-11T11:11:11+01:00');
    opus> $d->store()
    opus> $d->setServerDatePublished('2011-11-11T11:11:11+01:00');
    opus> $d->protectField('ServerDatePublished');
    opus> $d->setServerDatePublished('2011-11-11T11:11:11+01:00');
    Caught exception Opus_Model_Exception: Access to internal field not allowed: ServerDatePublished
    #0 /home/tklein/opus4-zib/framework/library/Opus/Model/Abstract.php(106): Opus_Model_Abstract->getField('ServerDatePubli...')
    #1 /home/tklein/opus4-zib/server/scripts/common/console.php(49) : eval()'d code(1): Opus_Model_Abstract->__call('setServerDatePu...', Array)
    #2 /home/tklein/opus4-zib/server/scripts/common/console.php(49) : eval()'d code(1): Opus_Document->setServerDatePublished('2011-11-11T11:1...')
    #3 /home/tklein/opus4-zib/server/scripts/common/console.php(49): eval()
    #4 /home/tklein/opus4-zib/server/scripts/opus-console.php(46): require_once('/home/tklein/op...')
    #5 {main}
    opus> 

Das Ausschließen von Feldern für das Editiern "von außen" (d.h. der Aufruf von protectField) könnnte im Bootstrap erfolgen.

@j3nsch
Copy link
Member Author

j3nsch commented Aug 22, 2022

Mit der auf Doctrine basierten Umsetzung der Datenbankanbindung in OPUS 4.8 ändert sich natürlich der Code komplett. Das Konzept von geschützten Feldern sollte aber auch für die neue Implementation geprüft und gegebenenfalls im Datenmodell berücksichtigt werden.

Sollte es Permissions für Nutzer geben, die auf der Ebene einzelner Felder geprüft werden. Ich denke es macht keinen Sinn einfach set-Funktionen zu blockieren. Die Einschränkung, dass diese Felder nur noch innerhalb der Model-Klasse, also nicht über die set-Funktion geändert werden können, schränkt die Möglichkeiten der Implementation beträchtlich ein. Im alten Framework sind Datenmodell, Datenbankanbindung, Workflow-Logic und weitere Funktionalität wie die Behandlung von Event für die DOI-Registrierung miteinander vermischt. Das macht Änderungen schwierig. Es macht den Code unübersichtlich. Die Klassen für die einzelnen Modelle sollten wesentlich weniger Verantwortung haben.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant