Организация проекта PHP

Что это

Вот что я сделал до сих пор:

  • ядро /
    • контроллеры / (содержит контроллеры, используемые приложением)
    • модели / (содержит модели, используемые приложением)
    • views / (содержит представления, используемые приложением)
    • base_controller.php (каждый второй контроллер расширяется)
    • base_model.php (модель расширяется)
  • поставщики /
    • phprouter / (простой класс маршрутизатора)
    • прыщ / (простой контейнерный класс DI)
  • configuration.php (содержит всю конфигурацию приложения)
  • index.php (включает конфигурацию, поставщиков, базовую модель, базовый контроллер, устанавливает контейнер DI и направляет запрос)

Смотрите код здесь: http://pastebin.com/pxUpUvv6
Обратите внимание, что данный код является лишь примером, поэтому контроллеры, модели, представления еще не созданы. Кроме того, он может содержать ошибки - как не проверенные - но это не имеет значения прямо сейчас.

Поток запросов

  1. Клиент запрашивает index.php.
  2. Конфигурация, поставщики, базовый контроллер, базовая модель включены.
  3. Контейнер DI и зависимости инициализированы, теперь мы можем вставить их куда угодно.
  4. Мы отображаем контроллеры на URL, и маршрутизатор выполняет свою работу.
  5. Контроллер извлекается (хотя этого нет в примере кода, как отмечено выше).
    • Мы делаем кое-что
    • Затем метод вызывает ::call_model(), который включает соответствующую модель из core / models /, а затем вызывает тот же метод, который мы используем из соответствующего класса модели.
  6. Модель взята.
    • Больше вещей.
    • Затем модель вызывает ::call_view() ', который включает в себя соответствующий вид из ядра / views /.
  7. Представление извлекается и визуализирует страницу для клиента.

К вашему сведению: соответствующие

Примеры контроллера, модели, вид которых соответствуют:

  • контроллер Controller_Products::list() в ядре / контроллеры /Controller_Products.php
  • модель Model_Products::list() как ядро / модели /Model_Products.php
  • Посмотреть в ядре /views/Model_Products_list.php

Проблемы, с которыми сталкиваются

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

  1. Имеет только базовую структуру папок core{, /controllers, /models/, /views}, vendors в корне - выглядит хорошо для вас?
  2. Я чувствую, что должен получить __autoload() за пределами index.php, который кажется мне слишком большим. Если так, то как насчет контейнера DI?
  3. Может быть, если мне понадобится более двух внешних библиотек, лучше не включать их вручную, вручную? Но как?
  4. Помещение всей конфигурации в файл configuration.php в корне выглядит для меня как старомодный PHP4. Благодаря мощности Pimple, я мог встраивать эту конфигурацию прямо в нее, но где?
  5. Я думаю, как я справляюсь ::call_model() (core / base_controller.php) и ::call_view() (core / base_model.php) немного неловко. Вы бы согласились? Что было бы упрощенным способом переделать все это?
  6. Учитывая все мои проблемы, будет ли мне лучше использовать фреймворк в качестве Symfony?

Если что-то не понятно, не стесняйтесь спрашивать.
Благодарю.

1 ответ

Решение
  1. Да.
  2. Вы можете использовать автозагрузку и DI-контейнер вместе. Существует пример того, как автозагрузка может использоваться с соглашением об именах. Я рекомендую использовать spl_autoload.
  3. С автозагрузкой вы можете удалить все (или почти все) включения.
  4. В index.php, я думаю.
  5. Да, это неверный путь. Прежде всего, постарайтесь не использовать статические методы. Кроме того, модели должны иметь методы с описательными именами, а не просто "позвони мне, и я сделаю все, что могу". Это более сложная проблема - вам нужно понять, как Контроллер и Модель должны сотрудничать. Как вариант, почитайте несколько книг. Контроллер должен вызывать методы Model, чтобы получить данные для некоторой ситуации. Модель это не просто место для кода контроллера. Разные контроллеры могут использовать разные модели. Модели тоже могут использовать другие модели.
  6. Ответ на этот вопрос не может быть объективным:)
Другие вопросы по тегам