Sto sviluppando un'applicazione web che presenta una timeline, proprio come una timeline di Facebook. La timeline stessa è completamente generica e collegabile. È solo una collezione generica di oggetti. Qualsiasi cosa con l'interfaccia appropriata (Dateable
) può essere aggiunta alla raccolta e visualizzata sulla timeline.Come progettare i filtri per una raccolta generica e collegabile?
Altri componenti (bundle Symfony) definiscono i modelli che implementano l'interfaccia Dateable
e impostano un provider in grado di trovare e restituire questi modelli. Il codice è molto simile a questo:
class Timeline
{
private $providers = []; // Filled by DI
public function find(/* ... */)
{
$result = [];
foreach ($this->providers as $provider) {
$result = array_merge($result, $provider->find(/* ... */));
}
return $result;
}
}
Il problema è che è necessario un set di filtri accanto alla timeline. Alcune opzioni di filtro (come date
) si applicano a tutti i provider. Ma la maggior parte delle opzioni no. Ad esempio, la maggior parte dei provider sarà in grado di utilizzare l'opzione di filtro author
, ma non tutti. Alcuni elementi di notifica sono generati dinamicamente e non hanno un autore.
Alcune opzioni di filtro si applicano solo a un singolo fornitore. Ad esempio, solo gli articoli evento hanno una proprietà location
.
Non riesco a capire come progettare un modulo di filtro che sia modulare come la timeline stessa. Dove dovrebbero essere definite le opzioni di filtro disponibili? Probabilmente le opzioni di filtro specifiche del pacchetto provengono dal bundle stesso, ma che ne è delle opzioni di filtro (come user
) che possono essere utilizzate da più bundle? E se alcune opzioni di filtro fossero più tardi utilizzabili da più pacchetti? Ad esempio, solo gli eventi hanno uno location
ora, ma cosa succede se viene aggiunto un altro modulo che ha anche elementi con una posizione?
E in che modo ciascun provider stabilirà se il modulo del filtro inviato contiene solo opzioni che comprende? Se imposto una posizione nel filtro, il BlogPostProvider
non dovrebbe restituire alcun messaggio, perché i post del blog non hanno alcuna posizione. Ma non riesco a verificare il numero di location
nel filtro perché BlogPostBundle non dovrebbe conoscere altri provider e le loro opzioni di filtro.
Qualche idea su come posso progettare una tale forma di filtro?