Struktura folderów frameworka PHP MVC ... czy robię to dobrze?

Obecnie pracuję nad własnym frameworkiem PHP i potrzebuję pomocy w ustaleniu, czy idę w dobrym kierunku, czy nie...

Framework jest zarówno do mojego własnego użytku, jak i do dalszego doskonalenia moich umiejętności w PHP. Napotkałem wiele problemów, które przezwyciężając je, nauczyłem się wiele i uwielbiam być w stanie stworzyć coś z niczego, więc wolałbym nie widzieć odpowiedzi typu "po prostu użyj Zend"! ;)

Przeczytałem kilka artykułów zarówno na temat Stack Overflow i kilka innych stron, ale nie do końca można uzyskać właściwą odpowiedź potrzebuję, więc mam nadzieję, że ktoś może dać mi jakąś pomocną radę!

Próbowałem kilku różnych rozwiązań, ale skończyło się na zamieszaniu i nie jestem pewien, w którym kierunku iść teraz! Nie mogę tego ogarnąć...

'teoretyczna" struktura ramowa

- .htaccess
- index.php
- private/
    - app/
        - bootstrap.php
        - modules/
            - default/
                - controllers/
                    - pages.php
                    - index.php
                - models/
                - views/
            - admin/
                - controllers/
                - models/
                - views/
    - config/
        - config.php
        - autoloader.php
    - lib/
        - Some_Library
            - Class1
                - class1.php
            - Class2
                - class2.php
- public/
    - css
    - images
    - scripts

Szczegóły

  • indeks.php jest głównym plikiem, gdzie każde żądanie jest przekierowanie do .htaccess .
  • prywatne / Nie mogą być dostępne publicznie, oczywiście.
  • public / zawiera wszystkie Pliki publiczne.
  • app / zawiera cały kod specyficzny dla aplikacji.
  • lib/ może zawierać Zend lub inną bibliotekę (pracuję również nad własną), do wywołania z autoloaderami
  • bootstrap.php jest kodem specyficznym dla aplikacji... czy tego potrzebuję? jest głównym indeksem.php" wystarczy?.
  • Moduły / zawierałyby każdy moduł... czy w ogóle potrzebuję modułów?.
  • default / jest domyślnym modułem, który będzie zawierał MVC dla większości żądań(używany, gdy 'admin' nie jest pierwszą częścią adresu URL).
  • admin / to moduł, który będzie zawierał MVC dla sekcji admin.

W każdym razie, na moje pytanie...

Pomyślałem, że lepiej będzie oddzielić sekcję admina z reszty strony, ale tam utknąłem. Wykonałem powyższą strukturę, aby z nią współpracować, ale nie jestem pewien, czy jest to najskuteczniejszy sposób.

Jeśli wniosek site.com/videos/view/1 / przychodzi na moją stronę..

Module: Default Kontroler : Filmy Akcja : Widok Params: array( '1')

I jeśli żądanie site.com/admin/pages/view/1 / przychodzi na moją stronę..

Moduł : Admin Controller : Strony Akcja : Widok Params: array( '1')

Czy to dobry sposób, aby to zrobić? Czy może przesadzam z tym i robię coś, czego nie warto robić?

Czy powinienem mieć całkowicie oddzielny framework aplikacji dla mojej sekcji administracyjnej...? Czy muszę w ogóle oddzielić MVC sekcji administracyjnej od reszty?

Przepraszam za ogromne pytanie, chciałem tylko dać Ci jak najwięcej informacji! Zapraszam do odpowiedz na którąkolwiek część możesz =P

Author: manbeardpig, 2010-06-14

3 answers

Jednym z rozwiązań dla adminów jest to, co robi CakePHP, najpierw definiujesz konfigurację dla łańcucha administratora a następnie w kontrolerze użyj akcji z określoną konwersją nazw

//Configuration ============================
Configure::write("admin_routing" , true );
Configure::write("admin_prefix"  , "admin" );

//Controller ===============================
class MyController extends AppController{

    function index(){
      //Will map to /mycontroller/
    }


    function admin_index(){
      //Will map to /admin/mycontroller/
    }

}

Można to uogólnić za pomocą systemu routingu zobacz, jak robi to twój ulubiony framework

On another note

  1. folder modułów wydaje się być nieecesary
  2. zgadzam się z antpaw należy dodać Widok globals i folder modelu, aby udostępnić je w całej aplikacje
  3. nie rozumiem, dlaczego autoloader jest w katalogu config, a nie jako część katalogu lib, można też po prostu przenieść boostrap.php do katalogu config

Hope this helps

 2
Author: Mon Villalon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 22:14:04

Wiem, że pytano o to dawno temu, ale byłem w tej samej sytuacji kilka dni temu.

Zaproponowane przez askera rozwiązanie jest w zasadzie tym, co wybrałem, o dziwo. W zasadzie zapożyczyłem koncepcję z ASP.NET MVC2 o nazwie "obszary". Obszary to sekcje strony, które mają własne kontrolery i widok (również modele, ale nie wiem dlaczego ... modele powinny być ogólnie uniwersalne). Więc jest to bardzo podobne do twojego początkowego pomysłu.

W każdym przypadku po ich struktura folderu+routingu miała całkiem sens dla mojej aplikacji(obszar typu admin, obszar użytkowników i inny poziom pomiędzy). Spójrz na to, a może znajdziesz tam jakiś sukces.

Mój routing uwzględnia tylko obszary. Trasy są mocno zakodowane, więc jeśli potrzebuję innego obszaru, po prostu dostosuję mój plik routingu. Oh również, moje autoloadery są ustawione, aby szukać w folderze area, jeśli podano $area.

/admin/team/add/ jest odczytywane jako, obszar: Admin, Kontroler: team, Akcja: add

]}

/team/add/ would read as, Area: [none], Controller: team, Action: add

Struktura folderów wygląda tak:

app/
   areas/
      admin/
          controllers/
          views/
      staff/
          controllers/
          views/
   controllers/
   models/
   views/
 2
Author: MikeMurko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-13 04:32:42

Sugerowałbym użycie Bootstrapa.php, który zarządza wszystkimi routingami, więc nigdy nie napotkasz problemów takich jak "chciałbym móc zagnieżdżać jeden folder więcej w moim module administracyjnym".

Nie korzystałbym również z modułów i zachowywałbym domyślne Kontrolery w katalogu controller / Admin oraz Kontrolery admin wewnątrz katalogu controller/admin. to samo dotyczy modeli i widoków.

Btw to naprawdę nie sprytne, aby nie dzielić się modelami między różnymi częściami aplikacji, będą to to samo w 99% wszystkich przypadków. dlatego mvc jest tak potężny. czasami możesz nawet udostępnić niektóre części widoku wewnątrz aplikacji między front-i backend.

 1
Author: antpaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-14 20:30:50