Object Data Accessor (ODA)
, (*1)
, (*2)
, (*3)
Features
- Vereinfacht das Nutzen von Datenhaltungsobjekten.
- Erhöht die Lesbarkeit von Quellcode, durch das Minimieren von LOC.
- Standardisiert DAO-Schicht mit einem kleinem Package, ohne groĂe Frameworks.
Installation
Bei der Installation ist Composer vorausgesetzt., (*4)
composer require phoenixrvd/oda
Basics
Angenommen, braucht man ein ein Objekt, welches genau 2 Datenfelder hat (foo und bar)., (*5)
Deklariert man Standard-Methoden, wird das Objekt wie Folgt aussehen:, (*6)
<?php
class MyDataObject {
private $data = [];
public function getFoo(){
return $this->data['foo'];
}
public function setFoo($value){
$this->data['foo'] = $value;
return $this;
}
public function hasFoo(){
return isset($this->data['foo']);
}
public function isFoo($value){
return $this->hasFoo() && $this->data['foo'] === $value;
}
public function getBar(){
return $this->data['bar'];
}
public function setBar($value){
$this->data['bar'] = $value;
return $this;
}
public function hasBar(){
return isset($this->data['bar']);
}
public function isBar($value){
return $this->hasBar() && $this->data['bar'] === $value;
}
}
HÀtte man nicht 2 sondern 10 Properties, wird das Object gleich um 300 LOC lÀnger., (*7)
Nutzt man das Packet, bekommt man gleiche FunktionalitÀt wesentlich kompakter. Auch wenn anzahl von Datenfelder wÀchst,
vergröĂert man nicht den Code-Basis., (*8)
Im Beispiel Unten ist vorheriges Objekt umgeschrieben:, (*9)
<?php
use PhoenixRVD\ODA\Interfaces\OdaObject;
use PhoenixRVD\ODA\Traits\DataAccessors;
use PhoenixRVD\ODA\Traits\ValueObject;
class MyDataObject implements OdaObject {
use ValueObject, DataAccessors;
}
IDE-Helper
Damit die IDE auch alle Objekt-Methoden kennt und man AutovervollstÀndigung nutzen kann, sollte man die Methoden
in der Klasse-Signatur festlegen., (*10)
Es ist aber immer noch kompakter als vorher., (*11)
<?php
/**
* @method $this setFoo(mixed $value)
* @method string getFoo()
* @method bool isFoo(mixed $value)
* @method bool hasFoo()
*
* @method $this setBar(mixed $value)
* @method string getBar()
* @method bool isBar(mixed $value)
* @method bool hasBar()
*/
Standard-Accessoren
Standard-PrÀfixes:, (*12)
PrÀfix |
Beschreibung |
get |
Gibt Wert eines Feldes zurĂŒck |
set |
Setzt Wert eines Feldes |
is(value) |
PrĂŒftob Wert exakt dem value Parameter entspricht (Vergleich mit === ) |
has |
PrĂŒft ob das Objekt ein Feld fĂŒr Daten enthĂ€lt (Equivalent: isset($array['value']) ) |
asJSON |
Gibt Wert eines Feldes als formatiertes JSON-String zurĂŒck. |
Eigene-Accessoren
Manchmal braucht man, dass bestimmte Felder eines Objektes formatiert zurĂŒckgegeben werden., (*13)
Z.b. $this->data['created_at']
ist Unix-Timestamp, man braucht es aber als RFC822-Datum., (*14)
Im Bespiel ist beschrieben, wie man der API ein date - Accessor beibringt. Damit wird voll automatisch
Unix-Timestamp nach Datum konvertieren und man es mit $this->dateCreatedAt()
ĂŒberall verwenden kann., (*15)
Beispiel
- Accessor-Klasse anlegen
<?php
use PhoenixRVD\ODA\Methods\AbstractMethod;
use PhoenixRVD\ODA\Interfaces\OdaObject;
class DateRFC822 extends AbstractMethod {
public function execute(OdaObject $object, array $attributes = array()) {
$data = $object->getData();
return date(DATE_RFC822, $data[ $this->propertyName ]);
}
}
-
Trait fĂŒr Wiederverwendbarkeit anlegen, (*16)
```php
<?php, (*17)
use PhoenixRVD\ODA\MethodFactory;, (*18)
trait MyObjectDecorator {, (*19)
public function __call($name, $arguments) {
return (MethodFactory::getInstance())
->setAccessor(new DateRFC822) // Eigenes Accessor bei der Factory registrieren
->makeMethod($name)
->execute($this, $arguments);
}
}, (*20)
3. Eigenes Trait an Stelle von Standard-Trait im Object verwenden.
```php
<?php
use PhoenixRVD\ODA\Interfaces\OdaObject;
use PhoenixRVD\ODA\Traits\ValueObject;
class MyDataObject implements OdaObject {
use ValueObject, MyObjectDecorator;
}
- Einfach die Methode aufrufen
<?php
// Ausgabe: Tue, 11 Apr 2017 21:22:14 +0000
echo (new MyDataObject())->setCreatedAt(1491945734)->dateCreatedAt();
Hinweis
Projekte, die auf sehr hohe Leistung ausgelegt sind, sollten auf die Methodik generell verzichten. Diskussion dazu findet man
hier., (*21)
Testing
composer oda:test
Copyright and license
Code released under the MIT License., (*22)