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!