Kolejna warstwa w aplikacji

Czytałem już co nieco na temat struktur katalogów, rozszerzania klasy Yii o własne klasy itp, jednak mam bardziej ścisłe pytanie.

Czy jest możliwe (w prosty sposób, bez znacznych modyfikacji) takie napisanie aplikacji, żeby dodać kolejną warstwę w aplikacji; może lepiej to na przykładowym rysunku przedstawię:


Projekt

|-Sklep

   |-strony

       |-CRUD+Model

   |-uzytkownicy

       |-CRUD+Model

   |-produkty

       |-CRUD+Model

   |-kategorie-produktow

       |-CRUD+Model


|-Klient1 extends Sklep

   |-strony

       |-CRUD+Model

   |-uzytkownicy

       |-CRUD+Model

   |-produkty

       |-CRUD+Model

   |-kategorie-produktow

       |-CRUD+Model

|-Klient2 extends Sklep

   |-strony

       |-CRUD+Model

   |-uzytkownicy

       |-CRUD+Model

   |-produkty

       |-CRUD+Model

   |-kategorie-produktow

       |-CRUD+Model

|-Klient3 extends Sklep

   |-strony

       |-CRUD+Model

   |-uzytkownicy

       |-CRUD+Model

   |-produkty

       |-CRUD+Model

   |-kategorie-produktow

       |-CRUD+Model

|-Klient4 extends Sklep

   |-strony

       |-CRUD+Model

   |-uzytkownicy

       |-CRUD+Model

   |-produkty

       |-CRUD+Model

   |-kategorie-produktow

       |-CRUD+Model



Chodzi mi o coś takiego, że posiadam główną gałąź rozwijanego sklepu, ale od niej dziedziczą projekty dla każdego klienta indywidualnie, więc mam to co napisałem + indywidualne rozszerzenie funkcji, których zażyczył sobie klient.

Czy takie coś jest w Yii w prosty sposób do osiągnięcia?

Wydaje mi się, że najłatwiej to osiągnąć za pomocą modułów. Tworzysz sobie moduł Sklep w katalogu modules. w tym samym katalogu tworzysz pozostałe moduły, przy czym dziedziczą one po Twoim module główny. Jeśli potrzebujesz zaimplementować dla danego klienta specjalną logikę, robisz to poprzez rozszerzenie klasy z modułu głównego w module klienta albo dodanie nowej klasy w module klienta.

Problem jaki możesz uświadczyć, to konieczność nazwania rozszerzonej klasy (np. kontrolera) inaczej niż klasę po której dziedziczysz. Wtedy, aby osiągnąć ten sam URL, musisz dopisać mapowanie w URLManagerze.