Причины отсутствия компактной структуры приложения MVC?

В веб-проекте MVC у меня есть следующая структура:

mymvc/                      -> Project root.
    public/                 -> Document root. The only one folder accessible from web.
        assets              -> Client-side assets. NOT ONLY for global themes and libraries, BUT ALSO for each specific "view" controlled by the "src/Application" components.
            css/
            js/
            images/
            ...
        index.php           -> Application entry point.
    src/                    -> UI layer rules.
        Application/
            Controller/
            View/
            ViewModel/
        Dispatcher/         -> Application dispatching - route matching, dispatching to the specified controller, etc.
        ...                 -> Other classes used by the components in the "src/Application" folder.
    templates/              -> Layout and template files.

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

Я подумал - на самом деле - о выполнении следующих двух шагов:

  1. Чтобы переместить каталог templates папку src/Application.
  2. Чтобы переместить каталог assets в src/Application, создайте конфигурацию alias /assets/ в веб-сервере (Apache) - указав на перемещенную папку и позвольте ей получить полный доступ из внешнего мира.

Используемые во всем мире активы - такие как CSS темы, или JS библиотеки кодов или фоновых изображений, или и т.д. - все еще может оставаться находится в public каталоге - явно не в папке с именем или псевдонимом assets.

Я действительно нахожу два шага очень хорошей идеей, потому что, как я вижу, обе папки содержат ресурсы, связанные со структурой из src/Application. Итак, вместо того, чтобы иметь что-то вроде этого:

  • src/Application/Controller/AboutUs.php
  • public/assets/js/AboutUs.js
  • templates/AboutUs/[multiple-layout-and-template-files],

структура, подобная следующей, выглядит намного лучше:

  • src/Application/Controller/AboutUs.php
  • src/Application/assets/js/AboutUs.js
  • src/Application/templates/AboutUs/[multiple-layout-and-template-files],

Но после изучения многих веб-фреймворков я понял, что все они полностью разделяют две папки (templates и assets) от папки приложения.

Поэтому я хотел бы спросить: есть ли какие-то конкретные причины, почему мое предлагаемое перемещение этих двух каталогов не может или не должно быть сделано?

Спасибо.

Ответ 1

Все зависит от того, чего вы хотите достичь, и каков ваш рабочий процесс. Вы, кажется, работаете в PHP - стоит посмотреть на фреймворки, отличные от PHP, такие как Ruby on Rails.

Как правило, вы хотите, чтобы выходная папка была "только для чтения" - разработчик не должен вручную редактировать файлы, вместо этого строит и развертывает конвейеры, запуская такие инструменты, как Gradle для преобразования файлов SASS/LESS и JS (из /source папки) в CSS и миниатюрный/объединенный Javascript и поместите их в нужное место в /public. Для построения и развертывания конвейеров часто используются разные конфигурации для разработки и производства (например, для сокращения добычи).

В Ruby on Rails структура в основном описывается как "намного лучше", за исключением того, что "шаблоны" представляют собой папку под "представлениями", называемую "макеты". Там есть шаг сборки (который выполняется автоматически), который преобразует различные файлы активов (SASS/LESS, JS и т.д.).

Вы можете увидеть подробное описание Рубина на структуру каталогов Rails здесь. Структура каталогов Django объясняется здесь.

Отвечая на вопросы в ваших комментариях:

  • Где должны быть файлы SASS/LESS/JS/Coffee script? - Вам решать. В Rails они живут в /app/assets/javascript и /app/assets/stylesheets; в этих папках для каждого представления есть один файл, а также файлы на уровне приложений. Это делает ваш процесс сборки приятным и простым - у вас есть всего 2 папки, о которых стоит беспокоиться, и не нужно изменять свою сборку каждый раз, когда вы создаете новое представление.
  • Как структурировать свои представления - у меня есть представления на уровне приложений и конкретные просмотры страниц. Опять же - в основном вопрос удобства. В Rails все шаблоны - живут под /app/views. Представления на уровне приложений живут в папке под названием /app/views/layouts - они действительно не так отличаются от шаблонов на уровне страницы, поэтому перемещение их из этой папки, похоже, не очень много, в то время как все в та же самая папка верхнего уровня упрощает сборку и настройку.

Итак, нет, нет причин делать то, что вы предлагаете.

Ответ 2

По-моему, каждый мог использовать структуру, которая ему подходит.

Я много работал с CodeIgniter в последние годы и сам занимаюсь жонглированием файлами и папками. В конце я думаю, что у меня есть структура, как мне нравится :)

Для папки приложения я, в основном, просто придерживаюсь рекомендуемой (основной) структуры, как в их руководстве и учебниках.

Это выглядит так:

- versionX
    - application
        - config
        - controllers
            - assets // Folder to keep asset specific controllers
                css.php
                js.php  // These controllers are bundling all resources and returning it as css, js or image file. Images can be cropped etc by params in url. Framework routes urls as domain.com/css/stylesheet.css to the css.php controller etc
                img.php
            documents.php // normal controller files
            users.php
            ...
        - core // core (controller) files from which controllers can extend
            APP_Controller.php
            APP_AssetController.php
            ...
        - helpers // Holds files with functions that you can use everywhere in the app.
        - libraries // Holds library files and folders
            PasswordHash.php
            Permissions.php
            Template.php
            Twitter.php
            ...
        - models // holds files with all DB logic (one file per DB table in my case, join tables not included)
    - public
        - css
        - js
            - components // javascript files for specific (large) page element(s)
                modal.js
                timeline.js
            - controllers // one js file per controller for controller specific js code
                documents.js
                users.js
            - resources // all libraries from 3rd party (Bootstrap, jQuery, ...)
        - uploads // user generated content (folder divided per file use/ origin)
    - themes
        - blueSky
            - views
                - layouts // app level views
                    - partials // app level partials (main navs, footers, ...)
                - documents // a folder per controller
                    - modals // modals used at document controller
                        _merge_document.php
                        _split_document.php
                    - partials
                        _form.php // for adding and editing documents
                        _drawer.php // submenu for document controller
                    index_view.php
                    create_view.php
                    edit_view.php
                    ...
                - users

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

Ответ 3

Классифицируйте свой код

Единственное, что я бы рекомендовал, это сохранить пространство имен равным структуре каталогов, чтобы сохранить автозагрузку простой. Оттуда, язык не заботится о том, как код организован. Два ограничения - это пространства имен и каталоги: они иерархичны. Таким образом, вы можете только классифицировать код в иерархической структуре.

Фактическая проблема заключается в том, что иерархическая классификация сама по себе является проблемой. Объекты можно классифицировать разными способами. К счастью, PHP не зависит от классификации, так почему же люди не могут быть одинаковыми? Потому что мы действительно думаем о коде и объектах. Мы ищем их, используем их, воспитываем. Это всего лишь вопрос личного опыта и вкуса, каковы ваши самые сильные ассоциации с определенным поведением объекта?

Есть одна дополнительная вещь, которую следует учитывать: "Ад - это другие люди".

Сохранение вашей классификации, совместимой с другими, как и в структуре Symphony, будет полезно после того, как ваш код начнет зависеть от этой конкретной структуры. Или схема классификации других может быть чем-то, что вы не хотите подвергать.

В любом случае, нет причин не делать то, что вы хотите. Если позже вы передумаете, по крайней мере, вы сами поймете, почему вы его изменили, и вы узнаете об этом.