Ich entwickle eine Web-Anwendung, die eine Zeitleiste ähnlich wie eine Facebook-Timeline bietet. Die Zeitleiste selbst ist vollständig generisch und steckbar. Es ist nur eine generische Sammlung von Elementen. Alles mit der richtigen Schnittstelle (Dateable
) kann zur Sammlung hinzugefügt und auf der Timeline angezeigt werden.Wie man Filter für eine generische, steckbare Sammlung entwirft?
Andere Komponenten (Symfony-Bundles) definieren Modelle, die die Schnittstelle Dateable
implementieren, und richten einen Anbieter ein, der diese Modelle finden und zurückgeben kann. Der Code ist ähnlich wie folgt aus:
class Timeline
{
private $providers = []; // Filled by DI
public function find(/* ... */)
{
$result = [];
foreach ($this->providers as $provider) {
$result = array_merge($result, $provider->find(/* ... */));
}
return $result;
}
}
Das Problem ist, dass es eine Reihe von Filtern neben der Timeline werden muss. Einige Filteroptionen (wie date
) gelten für alle Anbieter. Aber die meisten Optionen nicht. Zum Beispiel können die meisten Provider die Filteroption author
verwenden, aber nicht alle. Einige Benachrichtigungspunkte werden dynamisch generiert und haben keinen Autor.
Einige Filteroptionen gelten nur für einen einzelnen Anbieter. Beispielsweise haben nur Ereigniselemente eine Eigenschaft location
.
Ich kann nicht herausfinden, wie man eine Filterform entwirft, die genauso modular wie die Zeitachse selbst ist. Wo sollten die verfügbaren Filteroptionen definiert sein? Bündelspezifische Filteroptionen könnten wahrscheinlich aus dem Bündel selbst stammen, aber wie wäre es mit Filteroptionen (wie user
), die von mehreren Bündeln verwendet werden können? Und was ist, wenn einige Filteroptionen später von mehreren Bündeln verwendet werden können? Zum Beispiel haben nur Ereignisse jetzt eine location
, aber was ist, wenn ein anderes Modul hinzugefügt wird, das auch Objekte mit einem Standort hat?
Und wie wird jeder Anbieter feststellen, ob das übergebene Filterformular nur Optionen enthält, die es versteht? Wenn ich einen Speicherort im Filter festlege, sollte BlogPostProvider
keine Nachrichten zurückgeben, da Blogposts keinen Speicherort haben. Aber ich kann nicht auf location
im Filter überprüfen, weil das BlogPostBundle nicht über andere Anbieter und ihre Filteroptionen wissen sollte.
Irgendwelche Ideen, wie ich solch eine Filterform entwerfen kann?