Skip to content

Symfony2 Tipps und Tricks (1)

Ende letzten Jahres habe ich mein erstes Projekt mit dem (immer noch) relativ jungen PHP-Framework Symfony2 begonnen und war schnell davon begeistert. Symfony2 bringt einige für die PHP-Welt sehr moderne Eigenschaften mit, etwa das Arbeiten mit Annotations, Dependency Injection, Scaffolding, Datenvalidierung über Constraints und ein eigenes Caching-System (vieles davon ähnelt nebenbei bemerkt Django). Weil Symfony2 heute schon produktiv einsetzbar ist, ist es den anderen beiden großen PHP-Frameworks, Zend2 und FLOW3, um eine Nasenlänge voraus.

Symfony2 Tipps und Tricks

Viele Features sind äußerst angenehm, und ich möchte sie nicht mehr missen. Anderes ist gewöhnungsbedürftig, und es dauerte jeweils seine Zeit, bis ich herausgefunden hatte, wie es zu realisieren ist - und mögen es auch nur Kleinigkeiten gewesen sein. Diese Aspekte möchte ich hier im Blog in einer kleinen Serie festhalten, die ich "Symfony2 Tipps und Tricks" (sf2tt) genannt habe; sei es, damit andere davon profitieren können, sei es, damit ich selbst meine Kniffe schnell wiederfinden kann. Wenn ich übrigens Symfony2 sage, meine ich manchmal auch Doctrine2 (das standardmäßige ORM-Layer), Twig (die standardmäßige Template-Engine) oder ähnliche enge verbandelte Komponenten.

Deshalb geht es jetzt auch los mit einem Tipp zu Doctrine2 ;-)

Sortierte Collections aus der Datenbank lesen

Wir hatten im Projekt zwei Datenbank-Tabellen color_group und color ähnlich der folgenden:

Tabelle color_group
id name
1 Farbgruppe 1
2 Farbgruppe 2
Tabelle color
id name sequence group_id
1 blau 4 1
2 rot 2 1
3 gelb 1 1
4 grün 3 1

Die Farben aus der Tabelle color sind also nach Farbgruppen (color_group) gruppierbar und sollen nach color.sequence aufsteigend sortiert werden können. Doctrine2 ruft die Datensätze standardmäßig nach der Reihenfolge ab, in der sie in der Datenbank stehen (ids 1, 2, 3, 4). Nun könnte man die Sortierung nachträglich in PHP vornehmen, was aber doch recht umständlich ist. Besser geht es, wie unter Ordering To-Many Associations beschrieben.

Die zugehörigen Entities in Symfony2 sehen dann also in etwa wie folgt aus (mit Annotations). Zu beachten ist, dass den Annotations ein @ORM\ vorangestellt werden muss, wenn Doctrine2 in Symfony2 verwendet wird. Die Sortierung erfolgt durch @ORM\OrderBy({"sequence"="ASC"}) dann korrekt: 3, 2, 4, 1.

namespace Sperrobjekt\Sf2ttBundle\Entity;</p>

<p>use Doctrine\ORM\Mapping as ORM;</p>

<p>/**
 * @ORM\Table(name="color")
 * @ORM\Entity
 */

class Color
{
    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */

    protected $id;</p>

<pre><code>/**
 * @ORM\Column(name="name", type="string", length=255)
 */

protected $name;

/**
 * @ORM\Column(name="sequence", type="integer")
 */

protected $sequence;

/**
 * @var ColorGroup
 *
 * @ORM\ManyToOne(targetEntity="ColorGroup", inversedBy="colors")
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="group_id", referencedColumnName="id")
 * })
 */

protected $colorGroup;
/* ... */
</code></pre>

<p>}

namespace Sperrobjekt\Sf2ttBundle\Entity;</p>

<p>use Doctrine\ORM\Mapping as ORM,
    Doctrine\Common\Collections\ArrayCollection,
    Sperrobjekt\Sf2ttBundle\Entity\Entity\Color;</p>

<p>/**
 * @ORM\Table(name="color_group")
 * @ORM\Entity
 */

class ColorGroup
{
    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */

    protected $id;</p>

<pre><code>/**
 * @ORM\Column(name="name", type="string", length=255, unique=true)
 */

protected $name;

/**
 * @var ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="Color", mappedBy="colorGroup")
 * @ORM\OrderBy({"sequence"="ASC"})
 */

protected $colors;

/**
 * Constructor
 */

public function __construct()
{
    $this-&gt;colors= new ArrayCollection();
}
/* ... */
</code></pre>

<p>}

Für einen solchen Use-Case ist dies ein kleiner Tipp mit großer Wirkung und erspart dem Programmierer einige Mühe. Allerdings muss man erst einmal wissen, dass Doctrine2 diese elegante Möglichkeit anbietet.

Ausblick

Ich hoffe, dass diesem als erstem Teil einer kleinen Serie geplanten Beitrag bald noch weitere folgen werden. Vielleicht war der Einstieg auch etwas holprig, da er nicht direkt Symfony2 betraf - aber mit irgendetwas musste ich ja schließlich anfangen. Die Sortierfunktion musste ich immer wieder nachschlagen, aber jetzt werde ich sie mir merken können.

Wenn euch der Artikel gefallen hat (oder auch nicht), wenn ihr Korrekturen, Verbesserungsvorschläge oder sonstige Anmerkungen habt, schreibt euer Feedback bitte in die Kommentare. Ein bisschen Motivation für die nächsten Posts kann ebenfalls nicht schaden ;-)

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Markdown-Formatierung erlaubt
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Formular-Optionen

Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!