Я прочитал ваш вопрос вскоре после того, как вы его опубликовали, но у меня нет действительно твердого подхода к ответам.
Поэтому я решил просто пройтись по вашему сообщению сверху вниз и ответить на все вопросыменя это не устраивает.
Соединение с БД с правильно используемым синглтоном
Singletons have no use in PHP
Если вам нужен только один,только сделай один.Это только усложняет тестирование и вводит глобальное состояние, если вы используете синглтон.
Я только что устранил большинство статических вызовов и для необходимых синглетов, таких как соединение с БД всего приложения
Опять же: «синглтон», как в «я только создать один, это хорошо.«Синглтон» как и в «Узор» нет.Только не надо, вам это не нужно.
содержит / оборачивает его в объект, который будет передан вместе с другими необходимыми объектами в сотрудничающие классы.
Так в основном реестр?Вы добавляете что-то, и ваше приложение ожидает, что оно может извлечь что-то из этого.Таким образом, вы проходите вокруг промежуточного объекта вместо реальных объектов.Это может сработать, но обычно это не лучший подход.
Этот Google Tech Talk: Чистые беседы по коду - не ищите! отлично объясняет почему.
Подход, который я рассматриваю, заключается в использовании класса AppFactoryHelper, который действует как очень простая фабрика и создает объекты, отмеченные выше.
Вы создаете только базовые объекты для себяприложение один в вашей начальной загрузке, так что я не все уверен, почему вы хотите, чтобы обернуть их на заводе, но хорошо.Я вернусь к этому, когда речь заходит о коде.
Теперь о коде
Позвольте мне сначала сказать, что я пытался прочитать эти ~ 30 строк 5 раз, пока не получил зависаниеиз того, что вы пытаетесь сделать, даже если код довольно короткий.Может быть, только я;)
Требуется:
В настоящее время обычно используется автозагрузчик, если вам не нравится наносить ущерб структуре файла, привязывая к нему имена классов, используйте что-то вроде phpab , что всегда для гибкости.
Объекты:
Вы абстрагируете все, что ваше приложение делает с вашей AppHelperFactory.
$appHelperFactory = new AppHelperFactory;
$config = $appHelperFactory->createConfig($settings.php);
// dunno what $settings.php means here, i assume you mean "settings.php" or something
Я просто предлагаю, чтобы
$config = new Config();
$config->readFromFile("settings.php");
также выполнил свою работу, и, поскольку я предполагаю, что вам не нужно создавать объекты конфигурации повсюду, вы не должныпостроить завод только ради этого.
То же самое относится и к другим вашим объектам.
Ваш ObjectThatWillFinallyGetSomethingDone зависит от контейнера, в котором предполагается хранить как минимум 4 объекта, и насмешка над ними для тестирования будет довольно трудной задачей.(Или, по крайней мере, больше боли, чем нужно).
Особенно, когда вы создаете веб-приложение, я не вижу смысла в наличии объекта «приложение» (если вы используете его как свой«Основной метод» - это нормально, я думаю), но если вы хотите, чтобы он действительно тестировался модулем, вам нужно передать ему гораздо больше объектов, чем у вас есть в настоящее время.Такие вещи, как маршрутизатор, какой-то «controllerFactory» (или, тем не менее, вы обрабатываете запрос, отправляющий код, который выполняет вашу бизнес-логику) и так далее.
Использую ли я инъекцию зависимостей даже близко к нужному способу?
Вы используете реестр.Это что-то еще, но связано.
Читает по этой теме (за и против):
Flaw: Brittle Global State & Singletons
(разделы «Добавление или использование реестров» и «Добавление или использование локаторов служб»)
Do you need a Dependency Injection Container?
Dealing with dependencies
(только некоторые образцы)
и в некоторой степени связаны Object lifecycle control
В целом код, который вы показали, фокусируется на «построить много вещей и поместить их куда-нибудь, если мне это нужно» и не показывает, что вы на самом деле пытаетесь сделать (обычно отвечаязапросы).
Так что для этого .. да .. вам удалось это сделать, кроме некоторых мелких жалоб на код
$container->{$value} = $appHelperFactory->{$methodName}($config); // really? :(
Вы вроде как преуспели в этом. Если это на самом деле помогает или что-то хорошее, нельзя сказать только из этого кусочка начальной загрузки, я бы сказал.
Надеюсь, это поможет ... вы также можете перейти к PHP-чату здесь, на SO, для такого рода обсуждений, если вы не можете задать вопрос, потому что это слишком субъективно;)