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:
id | name |
---|---|
1 | Farbgruppe 1 |
2 | Farbgruppe 2 |
… | … |
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.
<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>}
<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->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
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt