Zajmuję się tworzeniem aplikacji internetowych z osią czasu, podobnie jak na osi czasu Facebooka. Sama oś czasu jest całkowicie ogólna i możliwa do podłączenia. To tylko ogólny zbiór przedmiotów. Wszystko z odpowiednim interfejsem (Dateable
) można dodać do kolekcji i wyświetlić na osi czasu.Jak zaprojektować filtry dla ogólnej, wtykowej kolekcji?
Inne komponenty (pakiety Symfony) definiują modele implementujące interfejs Dateable
i konfigurują dostawcę, który może znaleźć i zwrócić te modele. Kod jest bardzo podobny:
class Timeline
{
private $providers = []; // Filled by DI
public function find(/* ... */)
{
$result = [];
foreach ($this->providers as $provider) {
$result = array_merge($result, $provider->find(/* ... */));
}
return $result;
}
}
Problem polega na tym, że na osi czasu musi być zestaw filtrów. Niektóre opcje filtrowania (np. date
) mają zastosowanie do wszystkich dostawców. Ale większość opcji tego nie robi. Na przykład większość dostawców będzie mogła korzystać z opcji filtru author
, ale nie wszystkich. Niektóre elementy powiadomienia są generowane dynamicznie i nie mają autora.
Niektóre opcje filtrowania dotyczą tylko jednego dostawcy. Na przykład tylko elementy zdarzeń mają właściwość location
.
Nie mogę wymyślić, jak zaprojektować formę filtra, która jest tak samo modułowa, jak sama oś czasu. Gdzie należy zdefiniować dostępne opcje filtrowania? Opcje filtrów specyficzne dla zestawu prawdopodobnie pochodziłyby z samego pakietu, ale co z opcjami filtrowania (takimi jak user
), które mogą być używane przez wiele pakietów? A co, jeśli niektóre opcje filtrów staną się później dostępne dla wielu pakietów? Na przykład teraz tylko wydarzenia mają teraz location
, ale co się stanie, jeśli zostanie dodany inny moduł, który ma również elementy z lokalizacją?
I w jaki sposób każdy dostawca ustali, czy przesłany formularz filtra zawiera tylko te opcje, które rozumie? Jeśli ustawię lokalizację w filtrze, BlogPostProvider
nie powinien zwracać żadnych wiadomości, ponieważ posty na blogu nie mają lokalizacji. Ale nie mogę sprawdzić w filtrze location
, ponieważ BlogPostBundle nie powinien wiedzieć o innych dostawcach i ich opcjach filtrowania.
Jakieś pomysły, w jaki sposób mogę zaprojektować taką formę filtra?