Buduję aplikację w PHP, używając Zend Framework 1 i Doctrine2 jako warstwy ORM. Wszystko idzie dobrze. Teraz zauważyłem, że zarówno ZF1, jak i Doctrine2 mają własną implementację buforowania i polegają na niej. Oceniłem oba, i chociaż każdy ma swoje zalety i wady, żaden z nich nie wyróżnia się na tle innych pod względem moich prostych potrzeb. Obie biblioteki również wydają się być napisane przeciwko ich odpowiednim interfejsom, a nie ich implementacjom.
Powodem, dla którego uważam, że jest to problem, jest to, że podczas ładowania aplikacji muszę skonfigurować dwa sterowniki buforowania - każdy z własną składnią. W ten sposób można łatwo utworzyć niedopasowanie i dlatego nie jest możliwe skonfigurowanie dwóch połączeń z zapleczem buforowania.
Staram się ustalić, co jest najlepszym rozwiązaniem, i chętnie przyjmę wszelkie spostrzeżenia, które możesz zaoferować.
Do tej pory wymyśliłem cztery opcje:
- Nie rób nic, zaakceptuj obecność dwóch klas oferujących funkcje buforowania.
- Utwórz klasę Fasada, aby przykleić interfejs Zend do implementacji buforowania Doctrine.
- Opcja 2, odwrotnie - utwórz fasadę, aby zmapować interfejs Doctrine na backendie Zend Framework.
- Użyj dziedziczenia wielu interfejsów, aby utworzyć jeden interfejs, aby rządzić nimi wszystkimi, i módl się, aby nie nakładały się na siebie (tj. Jeśli oba mają metodę „zapisz”, będą musiały akceptować parametry w tej samej kolejności ze względu na PHP brak właściwego polimorfizmu).
Która opcja jest najlepsza lub czy istnieje wariant „Żaden z powyższych”, o którym nie wiem?
Odpowiedzi:
Nie rób nic Zaakceptuj, że oddzielne projekty mogą mieć nadmiarowość, o ile działają we własnych przestrzeniach (nie zanieczyszczając się wzajemnie pamięciami podręcznymi). Doctrine wie, że Zend ma buforowanie, ale nie chcą być zależni od Zend i odwrotnie. Nie wszyscy ludzie chcą korzystać z Zend i Doctrine.
Pozwoliłbym kodowi Doctrine używać własnych rzeczy i używać ZF do wszystkiego innego. W ten sposób muszę tylko znać klasy ZF. Pamięć podręczna Doctrine powinna być używana wewnętrznie przez doktrynę dla obiektu bazy danych. ZF ma więcej interfejsów, które są przydatne poza ORM, takie jak interfejs buforowania stron HTML.
Stworzenie kolejnej warstwy byłoby idealne, ale doda kolejną zależność do projektu, więc nie jest zbyt dobra do konserwacji.
Wiem, że w bootstrap konfigurowanie wielu pamięci podręcznych może wydawać się zbędne. Może się pogorszyć, jeśli spróbujesz jednocześnie używać ZF1, Doctrine i ZF2. Ale to bardzo mały stały czas, ponieważ konfigurują tylko zmienne, ale nie łączą się jeszcze z zapleczami.
Z punktu widzenia programowania, konserwacji i obsługi zostawiłbym je w spokoju.
źródło
Dlaczego nie rozwiązać tego problemu z punktu widzenia „uczynić konfigurację wygodniejszą”?
Innymi słowy, napisz nową klasę, która zaakceptuje twoje dane konfiguracyjne, a następnie zastosuje ją do obu sterowników buforujących. Jasne, nie jest tak elastyczny, ale oznacza to również, że mniej może się nie udać.
źródło
Dlaczego nie stworzyć abstrakcji interfejsu, która może być wyspecjalizowana w każdym frameworku? Napisałbym własny kontroler buforowania za pomocą potrzebnych mi metod, które obejmowałyby obie pamięci podręczne. Wtedy mogę o nich zapomnieć i porozmawiać tylko z moim Kontrolerem. Masz jakieś problemy z tym rozwiązaniem?
źródło