Czytałem na wielu frameworkach PHP, szczególnie w Zend Framework, ale jestem już zdezorientowany co do właściwego sposobu na kontynuowanie.Czy wzór DataMapper łamie MVC?
Zend Framework nie używa ActiveRecords, ale zamiast tego korzysta z wzorca Table Data Gateway i Row Data Gateway, i używa DataMappera do mapowania zawartości Row Data Gateway do modelu, ponieważ ActiveRecord rozkłada się, gdy twoje modele nie mapowanie 1: 1 do tabel bazy danych. W przewodniku Zend Quickstart znajduje się example of this.
Dla mnie ich przykład wygląda bardzo rozdęty z mnóstwem kolekcjonerów w całym miejscu. Natknąłem się na różne posty na blogach na temat Domain Driven Design, argumentując, że używanie tylu pobierających i ustawiających jest złą praktyką, ponieważ eksponuje wszystkie wewnętrzne dane modelu na zewnątrz, więc nie ma żadnej przewagi nad atrybutami publicznymi. Here is one example.
Moje pytanie: Jeśli usuniesz te pobierające i ustawiające, w jaki sposób renderujesz swoje widoki? W pewnym momencie dane muszą trafić w widok, aby rzeczywiście pokazać coś użytkownikowi. Postępowanie zgodnie z poradą DDD wydaje się przełamać separację między M i V w MVC. Podążanie za przykładem MVC i Zend wydaje się przerwać DDD i pozostawia mi pisanie wielu pobierających, ustawiających i DataMapperów dla wszystkich moich modeli. Oprócz dużego nakładu pracy wydaje się, że narusza ona także system DRY.
Naprawdę doceniam niektóre (linki do) dobrych przykładów lub więcej informacji o tym, jak to wszystko razem pasuje. Próbuję poprawić tutaj moje umiejętności projektowania i projektowania.
Dzięki. Ten artykuł z Devlicious dobrze się czyta. Przeczytam także resztę serii. –
To jest dobra odpowiedź, a ja dodam, że nie jest źle z pobierającymi, ustawiającymi. W rzeczywistości posiadanie ich jest doskonałym sposobem na dodanie logiki walidacji. Upublicznianie właściwości jest szybkie i brudne i jest w porządku podczas tworzenia prototypów, ale nie jest doskonałym rozwiązaniem długoterminowym. Załóżmy, że chcesz zmienić nazwę nieruchomości. Jeśli to zrobisz, każdy fragment kodu, który uzyskuje dostęp do tej właściwości, musi się zmienić. Jeśli używasz nazwy ogólnej dla metody akcesora, nie musisz zmieniać kodu klienta. Ponadto Doctrine jest znacznie bogatszym rozwiązaniem niż Zend DB. Nie polecałbym Doctrine1, ale wypróbuj Doctrine2. –