Инъекция зависимости в MVC - PullRequest
8 голосов
/ 20 января 2011

Я пытаюсь создать простой скелет MVC, и я застрял с зависимостями.

Это то, что у меня сейчас есть:

$config = new Config();
$database = new Database($config);
$uri = new Uri('article/5');
$request = new Request($uri);
$response = new Response;
$router = new Router;
$dispatcher = new Dispatcher($request, $response, $router);

$dispatcher->dispatch(); // Routing, instantiate controller, execute action, send response

Вопрос: как может любой объектполучить доступ к какой-либо зависимости?

Некоторые примеры:

  • Контроллеру может потребоваться Config для получения параметров форматирования вывода.
  • Mapper может потребоваться база данных для выполнения запросов.
  • Любому контроллеру / помощнику требуется доступ к журналу.
  • Помощнику может потребоваться любое количество зависимостей (например: Uri_Helper нужен маршрутизатор).

Единственная возможность, которую я могу представитьэто использование реестра, но это нарушает закон Деметры (спросите, что вам действительно нужно).

Ответы [ 2 ]

5 голосов
/ 20 января 2011

Вы пишете фабрики (отличная статья). Это может быть совершенно скучно (как упоминается в статье), поэтому вы можете использовать DI-фреймворк, например:

  • Symfony DIC: см. Пост Juraj.
  • PD
  • Yadif
  • Капать (PHP4): но некоторое время не обновлялся.

Также я хотел бы отметить, что блог Миско очень интересен и содержит много полезных материалов о том, как правильно проводить тестирование. Особенно необходимо прочитать руководство по написанию тестируемого кода .

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

Расмус Ледорф (цитата из PHP):

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

1 голос
/ 20 января 2011

Вы можете использовать контейнер ввода зависимостей, например Symfony DIC Вы определяете свои объекты, конфигурацию и проводку внутри контейнера, который заботится о создании экземпляров.

...