Организация проекта PHP - PullRequest
8 голосов
/ 15 июня 2011

Что это такое

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

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

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

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

  • Контроллер Controller_Products::list() на ядро ​​/ контроллеры / Controller_Products.php
  • Модель Model_Products::list() как ядро ​​/ модели / Model_Products.php
  • Просмотр в core / 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 Ответ

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