Причины отсутствия компактной структуры приложения 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's 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, создать псевдоним /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) полностью отделенными от папки приложения.

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

Спасибо.

Конечно, ваши веб-ресурсы (.js и т. д.) Должны оставаться в общей папке, чтобы пользователи могли получить к ним доступ.

Nigel Ren 29.07.2018 08:57

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

dakis 30.07.2018 16:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
11
2
341
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

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

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

Спасибо, Невилл. Я ценю! Я продлил свою награду еще на неделю, потому что у меня есть ощущение, что есть еще несколько аспектов, которые нужно раскрыть.

dakis 03.08.2018 19:28

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

В последние годы я много работал с 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

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

Хорошо! Я забыл упомянуть, что файл index.php (для запуска приложения) находится непосредственно в папке versionX, так же как .htaccess и другие вещи, такие как robots.txt (versionX на реальном сервере может быть папкой public_html, или вы можете добавить псевдоним, указывающий на папка versionX ...

Brainfeeder 30.07.2018 19:56

Большое спасибо, Brainfeeder! Я изучил ваш ответ и надеялся разделить награду. К сожалению, это было невозможно. Но знайте, я очень ценю ваши усилия. Я нашел часть «Эти контроллеры объединяют все ресурсы и возвращают их в виде css, js или файла изображения. Изображения могут быть обрезаны и т. д. С помощью параметров в URL». интересной. В любом случае, я продлил свою награду еще на неделю, потому что у меня есть чувство, что есть еще аспекты, которые нужно раскрыть.

dakis 03.08.2018 19:24

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

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

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

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

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

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

Спасибо, Code4R7. Я принял ответ Невилла, хотя и ваш тоже показался мне интересным.

dakis 10.08.2018 16:57

Другие вопросы по теме