Структура папок фреймворка PHP MVC правильно ли я это делаю?

В настоящее время я работаю над своей собственной PHP Framework, и мне нужна помощь, чтобы понять, иду ли я в правильном направлении или нет ...

Фреймворк предназначен как для моего личного использования, так и для дальнейшего развития моих навыков PHP. Я столкнулся с многочисленными проблемами, преодолев их, я многому научился и мне нравится создавать что-то из ничего, поэтому я бы предпочел не видеть ответы типа «Просто используйте Zend»! ;)

Я прочитал кучу статей как на Stack Overflow, так и на множестве других сайтов, но не могу получить правильный ответ, который мне нужен, поэтому, надеюсь, кто-нибудь может дать мне полезный совет!

Я пробовал несколько разных решений, но в итоге сбил себя с толку и не уверен, в каком направлении сейчас двигаться! Не могу осмыслить все это ...

«Теоретическая» рамочная структура

- .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

Подробности

  • index.php - это главный файл, куда направляется каждый запрос с помощью .htaccess.
  • Очевидно, что private / недоступен публично.
  • public / содержит все общедоступные файлы.
  • app / содержит весь код для конкретного приложения.
  • lib / может содержать Zend или другую библиотеку (я тоже работаю над собой), для вызова с автозагрузчиками
  • bootstrap.php - это код приложения ... Мне это нужно? Достаточно ли основного index.php?.
  • modules / будет содержать каждый модуль ... Нужны ли мне вообще модули?.
  • default / - это модуль по умолчанию, который будет содержать MVC для большинства запросов (используется, когда «admin» не является первой частью URL-адреса).
  • admin / - это модуль, который будет содержать MVC для раздела администратора.

В любом случае, на мой вопрос ...

Я подумал, что было бы лучше отделить раздел администратора от остальной части сайта, но здесь я застрял. Я создал указанную выше структуру для работы с ней, но не уверен, что это наиболее эффективный способ.

Если на мой сайт приходит запрос site.com/videos/view/1/ ..

Модуль: Контроллер по умолчанию: Видео Действие: Просмотр Параметры: массив ('1')

и если на мой сайт поступит запрос site.com/admin/pages/view/1/ ..

Модуль: администратор Контроллер: страницы Действие: просмотр параметров: массив ('1')

Это правильный способ сделать это? Или я слишком усложняю это и делаю то, чего делать не стоит?

Должен ли я иметь полностью отдельный фреймворк для моего раздела администратора ...? Нужно ли мне вообще отделить MVC административного раздела от всего остального?

Извините за массивный вопрос, просто хотел дать вам как можно больше информации! Не стесняйтесь отвечать в зависимости от того, что вы можете = P


person manbeardpig    schedule 14.06.2010    source источник
comment
напоминает мне структуру каталогов Symfony ;-)   -  person Thomas    schedule 20.06.2012


Ответы (3)


Одно из решений для маршрутизации администратора - это то, что делает CakePHP: вы сначала определяете конфигурацию для строки администратора, а затем в своем контроллере используете действия с определенным преобразованием имен.

//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/
    }

}

Вы можете обобщить это, используя систему маршрутизации, просто посмотрите, как это делает ваш любимый фреймворк.

С другой стороны

  1. Папка модулей кажется ненужной
  2. Я согласен с antpaw, вам следует добавить глобальный вид и папку модели, чтобы делиться ими между приложениями.
  3. Я не понимаю, почему автозагрузчик находится внутри каталога конфигурации, а не как часть каталога lib, вы также можете просто переместить boostrap.php в каталог конфигурации

Надеюсь это поможет

person Mon Villalon    schedule 15.06.2010
comment
Я включил решение CakePHP, которое вы показали выше, в свой текущий код с некоторыми изменениями. Вместо того, чтобы выполнять действия как для запросов по умолчанию, так и для запросов администратора в одном контроллере, я сделал так, чтобы в controllers / indexController.php находился Index_Controller, а также Admin_Index_Controller в controllers / admin / indexController.php. Я думаю, что это решение будет работать, если вы не видите что-то не так ..? Относительно № 2: Вы имеете в виду, что я должен добавить папку «views» и «models» вне каталога приложения? Или просто добавьте каталог views / common и models / common? - person manbeardpig; 17.06.2010
comment
Быстрый вопрос .. вызывает ли этот класс MyController другие контроллеры ?? Если мой класс маршрутизации (см. Мой комментарий к ответу antpaw) может настроить, какой контроллер / действие запускать, нужен ли этот класс MyController? Я не совсем понимаю, почему вы инициируете контроллер - просто - для запуска других контроллеров ... Но, может быть, я просто недостаточно знаю о MVC или Cake ... - person manbeardpig; 17.06.2010
comment
1. Admin_Index_Controller кажется разумным решением. Его преимущество состоит в том, что администратор разделяет обычную логику на два разных класса. 2. Я не совсем понимаю, что вы имеете в виду, говоря о вызове других контроллеров, это просто контроллер, система маршрутизации смотрит на URL-адрес и сопоставляет его с этим классом. Функция admin_index - это просто код, стоящий за обычным действием, просто маршрутизируется немного по-другому. Вместо / mycontroller / admin_index / он будет отображаться в / admin / mycontroller / index / из-за конфигурации - person Mon Villalon; 19.06.2010
comment
Я думаю, я запутался, где сказано, что это будет отображаться на ... думая, что эти действия будут загружать контроллеры из этих папок, но я думаю, что это просто означает, что эти действия вызываются этими URL-адресами, а не тем, что они их вызывают ... верно? Я думаю, что хочу иметь контроллеры администратора и т. Д. В полностью отличном классе и структуре от обычных. пользователи / добавить маршруты (через маршрутизатор в начальной загрузке) к контроллерам / usersController.php users_controller- ›add () и admin / users / добавить маршруты к контроллерам / admin / usersController.php (или admin / controllers / usersControllers.php ?? ) admin_users_controller- ›add (). Мысли? - person manbeardpig; 19.06.2010
comment
Извините, игнорируйте s на ссылке в скобках! - person manbeardpig; 19.06.2010
comment
Что касается автозагрузчика - если я помещу его в свой класс Core_Autoloader в /private/lib/Core/Autoloader.php, и я хочу запустить его из моего файла index.php с помощью 'spl_autoload_register (array (' Core_Autoloader ',' autoload ') ); ', Мне пришлось бы вручную включить файл класса ... какие поражения цели автозагрузчика, не так ли? - person manbeardpig; 21.06.2010

Я знаю, что об этом спрашивали давно, но несколько дней назад я был в такой же ситуации.

Как ни странно, предложенное пользователем решение - это в основном то, что я выбрал. По сути, я позаимствовал концепцию из ASP.NET MVC2 под названием «области». Области - это разделы сайта, у которых есть собственные контроллеры и представления (тоже модели, но я не знаю, почему ... модели должны быть универсальными). Это очень похоже на вашу первоначальную идею.

В любом случае следование их структуре папок + маршрутизации имело большой смысл для моего приложения (область типа администратора, область пользователей и еще один промежуточный уровень). Взгляните на него, и вы можете найти там успех.

Моя маршрутизация учитывает только районы. Маршруты жестко запрограммированы, поэтому, если мне нужна другая область, я просто корректирую свой файл маршрутизации. Кроме того, мои автозагрузчики настроены на просмотр в папке области, если указана $ area.

/admin/team/add/ читается как, Область: Администратор, Контроллер: команда, Действие: добавить

в то время как

/team/add/ будет читаться как, Область: [нет], Контроллер: команда, Действие: добавить

Структура папок примерно такая:

app/
   areas/
      admin/
          controllers/
          views/
      staff/
          controllers/
          views/
   controllers/
   models/
   views/
person MikeMurko    schedule 13.05.2011
comment
+1 Мне нравится идея, что модели вообще должны быть универсальными - person Wex; 02.04.2012

Я бы посоветовал вам использовать bootstrap.php, который управляет всеми маршрутами, чтобы вы никогда не сталкивались с такими проблемами, как «я бы хотел вложить еще одну папку в свой модуль администратора».

Я также не буду использовать модули и держать контроллеры по умолчанию прямо внутри контроллера / каталога и контроллеры администратора внутри каталога controller / admin. то же самое для моделей и представлений.

кстати, на самом деле неразумно не разделять модели между разными частями вашего приложения, они будут одинаковыми в 99% всех случаев. вот почему mvc такой мощный. иногда вы даже можете поделиться некоторыми частями представления внутри приложения между клиентской и серверной частью.

person antpaw    schedule 14.06.2010
comment
Я создал класс Router, который будет принимать какую-то переменную / массив «перенаправления», возможно, в виде строки. Переменная будет чем-то вроде admin, и если этот шаблон будет совпадать в URL-адресе, маршрутизатор настроится на загрузку контроллеров из папки admin /. Я подумаю о более эффективных / действенных способах после того, как разберусь со всем. Модули были отброшены, я понимаю, почему они не нужны =) И теперь я буду делиться моделями и некоторыми представлениями, я вижу, как это дает больше смысл сейчас! Спасибо! - person manbeardpig; 17.06.2010