Türchen 11: Symfony Klassen Tags und Collections

In Symfony lässt sich ganz einfach eine Collection von bestimmten Objekten einer Klasse aufbauen. Dazu nutzen wir sogenannte „Tags“ und ein Interface. Alle Objekte können dann als Liste ganz simpel überall abgerufen werden. In diesem Türchen nehmen wir als Beispiel verschiedene Badges.

Konfiguration der Services

In der „config/services.yaml“ definieren wir, dass alle Klassen, die das BadgeInterface implementieren, den Tag „app.badge“ bekommen. Die getaggten Klassen werden dann als Argument im Konstruktor der BadgeList reingereicht.

# config/services.yaml

services:
    _instanceof:
        App\BadgeInterface:
            tags: [ 'app.badge' ]

    App\BadgeList:
        arguments:
            - !tagged_iterator app.badge

Die Badge-Klassen

In diesem Beispiel legen wir zwei Klassen an, die das BadgeInterface implementieren und dann in der BadgeList zusammengesammelt werden.

<?php

class NewBadge implements \App\BadgeInterface
{
}

class SaleBadge implements \App\BadgeInterface
{
}

Die Collection-Klasse

Die Collection-Klasse ist hier unsere BadgeList, die dann überall als Dependency reingereicht werden kann. Aus dieser BadgeList können wir dann, mittels einer weiteren Funktion, alle Badges auslesen oder diese sogar filtern lassen.

<?php
namespace App;

class BadgeList
{
    private array $badgeList = [];

    public function __construct(
      iterable $handlers
    ){
        foreach ($handlers as $handler) {
            $this->badgeList[] = $handler;
        }

        var_dump($this->badgeList);

        /**
         * Ausgabe:
         *
         * array(2) {
         *  0 => class NewBadge [...],
         *  1 => class SaleBadge [...]
         * }
         */
    }
}

In diesem Beispiel wird natürlich nur ganz grob der Aufbau aufgezeigt. Ihr könnt das Ganze nun dynamisch so erweitern, wie ihr es selber in eurer Anwendung braucht. Sollte relativ selbsterklärend sein. Happy Coding!

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

crafted by code-x 💚
Nach oben scrollen