Куда должен идти автозагрузчик в MVC?

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

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

Загрузчик классов, который я пытаюсь использовать, можно найти здесь https://gist.github.com/221634

Просто пытаюсь понять, как правильно построить и организовать простую инфраструктуру MVC.

3 ответа

Решение

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

Вот как вы можете сделать это:

  1. Пересылайте каждый HTTP-запрос на ваш фронт-контроллер, index.php, app.php или как угодно, чтобы он вызывался.
  2. Front Controller может определить некоторые константы, используемые в фреймворке, а затем включить ваш файл Bootstrap.php. Bootstrap загрузит ваше приложение.
  3. Теперь первое, что я делаю в Bootstrap, это регистрация автозагрузки. Таким образом, я могу легко получить класс \System\Router\Router или \System\Router\Dispatcher, и вы поймете.

Еще одна вещь, вы даже можете зарегистрировать папку Models вашего приложения с загрузчиком классов PSR0. Итак, допустим, что ваша папка Models выглядит так:

application/Models/
    - Entities
    - Services
        Email.php
        Cache.php

Внутри вашего контроллера вы можете легко получить такие модели

public function someController()
{
    $email = new \Models\Services\Email();
    // Do stuff with email service
}     

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

И тогда вы даже можете зарегистрировать автозагрузку для вашей папки Controllers and Models вашего приложения, а в конце файла Bootstrap, когда вы собираетесь отправить запрос, вы можете запросить Controller следующим образом:

$app = new '\\Application\\Controllers\\' . $class;
// Dispatch request with call_user_func_array or ReflectionMethod and ReflectionClass

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

Отличный вопрос, надеюсь, это поможет! Приятно видеть, что есть другие парни, играющие с их привычным MVC:)

Определенно на этапе начальной загрузки!

Автозагрузчик должен быть частью каждого PHP-приложения и должен быть (одним из) первых инициализированных классов / кодов.

Мои шаги инициализации MVC:

  • индекс является точкой входа
  • загрузчик для инициализации обработки ошибок, автозагрузчик и IoC
  • приложение, в основном приложение MVC
  • механизм маршрутизации
  • контроллер
  • модель
  • Посмотреть

Ну и вопрос "Куда это денется?" мне предлагает два более точных вопроса:

  1. Где хранится файл, содержащий определение функции / класса автозагрузчика?
  2. Где в вашем цикле отправки запросов должен быть создан, сконфигурирован и разрешен этот магический процесс?

Первый вопрос - "Где разместить файл, содержащий класс?" - возможно, это не так критично для вас, поскольку вы определили класс автозагрузчика, который хотите использовать. Точный ответ зависит от вашей собственной структуры приложения фреймворка, но для внешне разработанного класса, такого как тот, который вы цитируете, где-то внутри lib или же vendor каталог, вероятно, имеет смысл.

На второй вопрос - "Где создать экземпляр, настроить и т. Д.?" - ответ таков: как можно раньше в цикле запросов, чтобы вы могли получить выгоду от автозагрузки для всех классов, на которые ссылаются позже. В практическом плане это, вероятно, означает, что где-то в вашем процессе начальной загрузки.

Конечно, это обычно означает, что для загрузки вашего класса автозагрузчика, вам, вероятно, придется сделать руководство require/include вызовите, создайте экземпляр вашего объекта автозагрузчика и настройте его с помощью пространств имен и путей.

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