oop — PHP MVC: внедрение экземпляров служебных / вспомогательных классов в базовые классы как зависимости

В моем проекте HMVC я реализовал Arrays учебный класс. это STATIC Методы используются в целом для обработки различных операций над многомерными массивами. Помимо этого класса я тоже использую похожие: Files, Images, Printer, Messages, Classesи т. д. Но я больше не хочу, чтобы в моем проекте были статика или синглтоны.

Я вижу их как помощников, конечные классы имеют методы, используемые для простого выполнения определенных задач над компонентами проекта или с ними (объединение массивов, изменение размера изображений, загрузка / печать файлов и т. Д.). Поэтому я хочу … минимизировать их распространение в моем проекте.

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

Я хотел бы спросить:

  • Это неправильно, что я на самом деле объединяю массивы внутри базового класса контроллера, или такая ситуация действительно может возникнуть?
  • Если это не так, то у меня есть только выбор, чтобы передать служебный класс Arrays как зависимость конструктора, а статический проблема будет элегантно решена таким образом. Это правда или есть лучшая альтернатива?

Буду признателен за любую вашу точку зрения.

Большое спасибо!


P.S:

Здесь Arrays класс, если вам нужно взглянуть на него:

<?php

namespace MYMVC\Utils;

/**
* Arrays: utility class to handle operations on multidimensional arrays.
*/
class Arrays {

/* ------------------------------------------------------------- */
/* Keypath format: '{key0}/{key1}/{key2}/{key3}/{searched-key}'. */
/* ------------------------------------------------------------- */

/** Set the value in array at the specified keypath. [...] */

public static function setArrayValue(&$array, $keypath, $value, $delimiter = '/') { ... }/** Get a tree structure from the specified keypath. [...] */

public static function buildArrayTree($keypath, $value, $delimiter = '/') { ... }/** Check if the specified keypath exists in array. [...] */

public static function arrayKeyExists(&$array, $keypath, $delimiter = '/') { ... }/** Get the array value from the specified keypath. [...] */

public static function getArrayValue(&$array, $keypath, $delimiter = '/') { ... }/** Merge multiple multidimensional arrays. [...] */

public static function mergeMultipleArrays(/* func_get_args */) { ... }/** Merge the top multidimensional array over the base multidimensional array. [...] */

public static function mergeArrays($base, $top) { ... }

}

0

Решение

Что-то вроде Arrays::mergeArrays не так. Вы не против позвонить in_array или же array_merge в ваших классах, нет? Ты можешь позвонить Arrays класс «полезности», если хотите, но я не думаю, что вы можете сделать то же самое для Files,

Если ваша текущая проблема — «Я не хочу передавать объект xyz каждому дочернему контроллеру», то обычно у вас есть мысли:

  • Просто введите DIC в ваши контроллеры. Затем восстановите свою зависимость от него. Это то, что называется «Service Locator» и широко используется многими фреймворками. Преимущество в том, что вы можете требовать зависимости только там, где она вам нужна, и тогда, когда она вам нужна. Но у него есть ряд недостатков. Ваш объект не может существовать без него, и ваши классы не могут быть легко издевались. Вот почему это считается анти-паттерном.

  • Внедрить свою зависимость (т.е. Files) явно в ваших контроллерах. Почему вы должны хотеть скрыть тот факт, что ваш контроллер зависит от Files? Единственная проблема здесь, особенно с контроллерами, в том, что многие зависимости не всегда используются всеми методами класса. Это больше проблема производительности, и вы можете решить ее разными способами (пример:
    Объект действия).

Выберите то, что работает для вас.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]