Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Domyślne i "spersonalizowane" aplikacje
Forum PHP.pl > Forum > PHP > Frameworki
piotrooo89
Witam,

mam pytanie natury organizacyjnej, jak najlepiej w ZF zbudować aplikacje która miała by działać w ten sposób:

mam główne założenia mojej aplikacji powiedzmy, że są to założenia które wdrażamy default'owo klientowi, i jakiś "niesforny" klient chce drobną modyfikacje pod swoje potrzeby w aplikacji, i chce tylko wdrożyć u niego te aplikacje, nie tracąc jednak głównej funkcjonalności.

czyli są moduły i klient chce zmienić dany moduł, jak dostarczyć mu rozwiązanie custom'owe (nie burząc głównej gałęzi projektu)

Przykład:
mam tabelkę wyświetlającą u wszystkich klientów Imię, Nazwisko, po pozyskaniu nowego klienta on chce żeby jemu do tej tabelki dołożyć maila i avatara, ale chce to zrobić TYLKO u niego, reszta klientów podczas wdrażania dalej będzie miała tylko Imię i nazwisko tylko ten jeden będzie miał kontroler który pokieruje w taki sposób żeby wyświetlić mu odpowiednie dane?

Proszę o jakieś nakierowanie, jeśli moje założenia są nie do końca jasne pytajcie, a może są lekko złe więc też proszę o naprowadzenie.
zend
Nie miałem okazji tego jeszcze sprawdzić w praktyce, ale ostanio spotkałem się z podobnym problemem, moje przemyślenia na szybko to:

1)
  1. class Users_UserController{/*podstawowy kontroler*/ }
  2. class Default_UserController extends Users_UserController {}


2)Dodajesz routing '/users/user/:action/*' => array('controller' => 'user', 'module' => 'default', 'action' => 'index),
3) Kopiujesz widoki do modułu default
4)Formularze musisz pobierać oczywiście przez jakąś metodę z kontrolera bazowego żeby dalo się to potem ładne nadpisać
5)Założenia że będziesz nadpisywał konkretne moduły musisz zrobić już na samym początku i w innych modułach wyświetlać użytkowników przez
$view -> render('users/singleUser.phtml') + nadpisać odpowiednio Zend_View

@note - kontrolery niekoniecznie musisz nadpisywać w głównym module, mozesz też stworzyć moduł z przeróbkami dla konkretnego klienta

Jeśli chodzi Ci o konkretny przykład z tabelką to chyba najlepszym pod względem założeń, ale też i najbardziej nieoptymalnym było by wykorzystanie helpera partialLoop. Albo tak jak wspominałem wcześniej nadpisanie Zend_View dla konkretnego klienta i zahardcodowanie innej ścieżki to tego konkretnego widoku

Poza tym podłączam się do pytania, jestem ciekaw jak inni to rozwiązują
michaJlS
To chyba nie jest problem specjalnie związany z zastosowaną technologią, tylko ogólne zagadnienie inzynierii oprogramowania. Jak znajdziesz dobre rozwiązanie, to zostaniesz bogaty;)

Jak masz swoje jedno konkretne rozwiązanie, które wdrażasz u różnych klientów, to po jakimś widzisz, o jakie zmiany, jakiego typu, proszą. Możesz potem na tej podstawie tak przetworzyć swoją apkę, żeby ci się potem te zmiany łatwo dodawało. Zazwyczaj to jest jednak tak, że nie wystarczy podmienić jednego kontrolera, tabelki itd.

Ew. zanim zabierzesz się za pisanie, to możesz się zastanowić, czego klienci mogą chcieć. Wtedy tworzysz odpowiedni model aplikacji. Modułowa budowa, tworzenie dodatków (wordpress), hooki przy każdej akcji (mediawiki), generowanie kodu na podstawie jakichś xmli (magento ponoć) itd itp.

Można też dodawać te funkcjonalności do głównej wersji, ale aktywować je dopiero odpowiednią konfiguracją (dane opcje będą widoczne tylko u jednego klienta).

Jakimś sposobem jest tworzenie forków projektu i odpowiednie kasowanie klienta, żeby ci się opłacało potem robić merge.
piotrooo89
Czyli jak dobrze rozumiem, app'a trzeba oprzeć o moduły?
@zend no jest to dość ciekawe rozwiązanie, a co np w takiej sytuacji:

mam WebService standardowy który dostaje klient zawsze i zawsze jego funkcjonalność jest stała. Przychodzi nowy klient i chce zrobić integracje na poziome WS ze swoją app'ką i chce wystawić mu WS TYLKO dla mnie, skierowany konkretnie pod jego potrzeby. Myślałem o czymś takim:
mam folder custom w którym mam rozwiązania indywidualne i jeśli znajduje sie w tym pliku jakiś np. WS to "przejmuje" on kontrole na całością, czyli inaczej, WS standardowy przestaje obowiązywać i jego funkcjonalności przejmuje WS pisany na potrzeby klienta.
zend
Co do WS to najprościej będzie Ci to oprzeć o Zend_Loader_PluginLoader, ja osobiście korzystam z sfServiceContainer z symfony, funkcjonalność podobna + wstrzykiwanie zależności. Polecam też korzystanie z nadpisanego event dispatchera, ja nadpisałem swój tak aby korzystał z sfServiceContainer, pozwala mi to uniknąć niepotrzebnego tworzenia instancji obiektów kiedy nie są potrzebne

  1. $event -> connect('user.login' , array('model.basket', 'saveInDatabase'));


Instancja koszyka tworzona jest dopiero przy wywołaniu $event -> dispatch('user.login'), do modelu koszyka wstrzykiwany jest też automatycznie dopowiedni model bazodanowy. Wszystko jest ładnie, przejrzyście i co najważniejsze modyfikacja logiki w aplikacji jest bajecznie prosta
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.