2012-08-08 9 views
8

Chciałbym poradzić sobie z Zend Framework 2, używając go do małego projektu. Przeglądałem różne artykuły na blogach, dokumenty i oczywiście fantastyczny tutorial autorstwa Akrabata (Rob Allen).Jaka jest prawidłowa lub preferowana struktura katalogów dla modułu Zend Framework 2?

Jednak w całym moim czytaniu nie natknąłem się na żadne wyjaśnienia dotyczące prawidłowej lub preferowanej struktury katalogów dla modułu, którego oczekuje Zend Framework 2.

W przykładowym module Rob Allena używa jednego modelu i kontrolera. Struktura katalogu wybrał było:

/module 
    /Album 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
     /view 
      /album 
       /album 

To wszystko jest w porządku, ale co, jeśli moduł miał wiele kontrolerów i modeli, jak można się spodziewać w miejscu, które miało wiele stron/sekcje? Czy umieściłbym wszystkie moje kontrolery w katalogu/src/Album/Controller, czy też utworzyłbym inny zestaw/src/xxx/katalogów dla każdego dodatkowego modelu i powiązanych kontrolerów i widoków?

Czy w katalogach/widoku dzielę je na podkatalogi dla każdego zestawu widoków używanych przez różne kontrolery?

Myślę, że zamieszanie związane jest z faktem, że w przykładzie Roba jego główny kontroler/model jest taki sam jak moduł. Tak więc jego moduł Album ma katalog, z bardziej katalogami albumów dla modeli, kontrolerów i widoków. Gdybym miał zmienić nazwę swojego modułu z Album do, powiedzmy, mymodule będzie struktura katalogów następnie stać:

/module 
    /MyModule 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
     /view 
      /MyModule 
       /album 

Byłoby następnie postępuj że dodatkowy model Wykonawca, i związane z nimi kontrolery byłoby zorganizowane w ten sposób:

/module 
    /MyModule 
     /config 
     /src 
      /Album 
       /Controller 
       /Form 
       /Model 
      /Artist 
       /Controller 
       /Form 
       /Model 
     /view 
      /MyModule 
       /album 
       /artist 

Jeśli nie powyższe, to jaka byłaby struktura?

Jest to oczywiście zakładanie, że ZF2 oczekuje ścisłej struktury. Jeśli tak nie jest, to oczywiście mogę zorganizować to tak, jak chcę.

Odpowiedz

14

Aby szybko odpowiedzieć na ostatnie pytanie - ZF2 w rzeczywistości nie dba o strukturę katalogów. Albo raczej powinienem powiedzieć - nie ma on predefiniowanej struktury. Z tego powodu posiada on konfiguracje autoloadera i mapy klas (w zależności od wybranego podejścia).

„default” autoloader (patrz Module.php), które można znaleźć w większości przykładów zakłada tylko, że zajęcia modulename będzie można znaleźć w katalogu ./src/ModuleName:

// ./modules/ModuleName/Module.php 
public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ), 
     ), 
    ); 
} 

Zakładam, że wiesz to właśnie oznaczają te części.

Tak więc, jeśli masz moduł o nazwie Cat, jego klasy można znaleźć w ./modules/Cat/src/Cat.

Jeśli zdecydujesz się dodać nowe funkcje do swojej aplikacji, dodaj kolejny moduł o nazwie Dog i umieść pliki klas w ./Dog/src/Dog.

Jednak to w żaden sposób nie oznacza, że ​​musisz to robić w ten sposób. Możesz również umieścić wszystkie swoje klasy związane ze zwierzętami w jednym module zwanym np. Animals. trzeba by zmodyfikować autoloadery wyglądać następująco:

// ./modules/Animals/Module.php 
public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       'Cat' => __DIR__ . '/src/Cat', 
       'Dog' => __DIR__ . '/src/Dog', 
      ), 
     ), 
    ); 
} 

... i umieść swoje klasy w plikach jak ./modules/Animal/src/Cat/Persian.php i ./modules/Animal/src/Dog/Collie.php.

Jedną z rzeczy, które chciałbym zasugerować, jest myślenie o modułach jako oddzielnych jednostkach, nie znających nic konkretnego na temat innych modułów. Jako przykład "prawdziwego życia" - mam aplikację z interfejsem (html, css itp.) I funkcjonalnością API.

mam 3 moduły:

  • Application - zawiera pliki konfiguracyjne bazy danych, zajęcia tabeli db, twórców map, modeli, zajęcia uwierzytelniania itd zasadzie wszystko, że każdy inny moduł może potrzebować.
  • Api - ma kontrolery oczekujące żądań w określonym formacie i wyświetlające go jako np. JSON (tj. Brak wymaganych widoków). Klasy w tym module używają klas z modułu Application, ponieważ wciąż potrzebuję całej funkcjonalności bazy danych, ale posiadanie wszystkich oddzielnych daje mi oddzielenie logiki aplikacji od logiki API. Mógłbym zgrać ten moduł tak, jak chciałem i nie złamałbym niczego innego.
  • Website - moduł odpowiedzialny tylko za renderowanie stron. Ponownie używa klas z aplikacji, ponieważ chcę móc renderować dane z bazy danych i pozwolić użytkownikom na edycję, ale nie chcę funkcjonalności wyłącznie w tym module, ponieważ Api też tego potrzebuje.

Moi ./config/application.config.php ładuje je w tej kolejności:

return array(
    'modules' => array(
     'Application', 
     'Api', 
     'Website', 
    ), 
    // all other entries 
); 

Oznacza to, że mam dostęp do wszystkich klas aplikację z innymi modułami. Jeśli z jakiegoś powodu chciałabym wyłączyć mój interfejs API, po prostu usunąłbym katalog Api i mój front-end nadal by działał.

Mam nadzieję, że to pomoże! :)

TL; DR Możesz układać pliki w dowolny sposób, nie zapomnij jednak poprawnie skonfigurować autoloadera.

Powiązane problemy