Doctrine

Der “EntityManagerTrait”

Bei Doctrine ist der EntityManager das zentrale Objekt für den Zugriff auf die Datenbank. Dieser steht allen Klassen (vorzugsweise den Services im MVC Konzept) über einen Trait zur Verfügung.

Beispiel für die Verwendung des “EntityManagerTrait”:

namespace Test\Service;
class Test
{
    use \DragonJsonServer\ServiceManagerTrait;
    use \DragonJsonServerDoctrine\EntityManagerTrait;
 
    public function test() {
        $entityManager = $this->getEntityManager();
    }
}

Die Verwendung von Traits für oft benutzte Spalten

Die Definition einer Spalte als Attribut samt Doctrine Annotation und setter/getter Methoden führt bei oft verwendeten Spalten wie “created” und “modified” zu Codeduplizierungen. Aus diesem Grund nutze ich für diese Spalten Traits.

Beispiel für die Verwendung des “created” Trait:

/**
 * @Doctrine\ORM\Mapping\Entity
 * @Doctrine\ORM\Mapping\Table(name="tests")
 */
class Test
{
    use \DragonJsonServerDoctrine\Entity\CreatedTrait;
 
    /** 
     * @Doctrine\ORM\Mapping\Id 
     * @Doctrine\ORM\Mapping\Column(type="integer")
     * @Doctrine\ORM\Mapping\GeneratedValue
     **/
    protected $test_id;
}

Auch für Relationen nutze ich Traits. Da diese Spalten in verschiedenen Entities benutzt werden.

Beispiel für die Definition eines Traits für eine Relation:

namespace Test\Entity;
trait TestIdTrait
{
    /**
     * @Doctrine\ORM\Mapping\Column(type="integer")
     **/
    protected $test_id;
 
    public function setTestId($test_id)
    {
        $this->test_id = $test_id;
        return $this;
    }
 
    public function getTestId()
    {
        return $this->test_id;
    }
}

Jede Klasse die eine Relation zur Test Entity benötigt kann daher den “TestIdTrait” einbinden.

Umwandlung von/nach Array

Vom Client kommen Daten in Form von assoziativen Arrays und der Client erwartet als Rückgabe Arrays. Daher bieten alle Entityklassen im Framework die Möglichkeiten die Entity in einem Array abzubilden bzw. von einem Array befüllt zu werden.

Beispiel für die Umwandlung einer Entity von/nach Array:

$account = (new \DragonJsonServerAccount\Entity\Account())
    ->setName('test')
    ->setLanguage('de');
$array = $account->toArray();
$account = (new \DragonJsonServerAccount\Entity\Account())
    ->fromArray($array);

Für die Umwandlung von Arrays von Entities steht der Doctrine Service zur Verfügung der eine Liste von Entites zu einer Liste von Arrays und umgekehrt unwandeln kann.

Transkationen

Doctrine bietet einen Wrapper für Transaktionen, der allerdings im Fehlerfall das Connectionobjekt als “nicht mehr verwendbar” markiert. Somit lassen sich nach einem Fehlerfall beispielsweise keine Clientmessages mehr am Ende des Requests aus der Datenbank abfragen. Aus diesem Grund bietet das Doctrine Paket einen eigenen Wrapper an ohne diese Markierung.

Beispiel für die Verwendung des Wrappers für Transaktionen:

namespace Test\Service;
class Test
{
    use \DragonJsonServer\ServiceManagerTrait;
 
    public function test() {
        $this->getServiceManager()->get('\DragonJsonServerDoctrine\Service\Doctrine')->transactional(function ($entityManager) {
            //Datenbankoberationen innerhalb einer Transaktion
        });
        return $this;
    }
}