PHP MVC:将实用程序/辅助类实例作为依赖项注入基类

时间:2017-06-03 22:33:16

标签: php oop design-patterns model-view-controller mvvm

在我的HMVC项目中,我实施了Arrays课程。其 STATIC 方法总体上用于处理多维数组上的各种操作。除了这个课程,我也使用类似的课程:FilesImagesPrinterMessagesClasses等。但我不想要任何我的项目中的静力学或单身人士了。

我将它们视为帮助程序,最终类具有用于在项目组件上或与它们执行特定任务的方法(合并数组,调整大小图像,上载/打印文件等)。因此,我想...最小化他们在我的项目中的分布。

例如,我没有发现在每个子控制器中传递Arrays对象是最佳的,只是因为在基本控制器类的构造函数中,必须合并一些数组。

我想问:

  • 我实际上在基本控制器类中合并数组是不对的,或者这种情况真的会出现?
  • 如果没有错,那么我只能选择将实用程序类Arrays作为构造函数依赖项,并且 static 问题将得到优雅解决这条路。这是真的,还是有更好的选择?

我很欣赏你的任何观点。

非常感谢!

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) { ... }

}

1 个答案:

答案 0 :(得分:-1)

Arrays::mergeArrays之类的东西并没有错。您不介意在课程中拨打in_arrayarray_merge,不是吗?如果您愿意,可以将Arrays称为“实用程序”类,但我认为您不能对Files执行相同操作。

如果您当前的问题是“我不想将xyz对象传递给每个子控制器”,那么通常您会有以下思路:

  • 只需将DIC注入控制器即可。然后从中检索您的依赖项。这就是所谓的“服务定位器”,它被许多框架广泛使用。它的优点是,您可以仅在需要时以及需要时使用依赖项。但它有一系列的缺点。没有它你的对象就不存在,你的类也不容易被嘲笑。这就是为什么它被认为是一种反模式。

  • 在控制器中明确地注入您的依赖项(即:Files)。为什么你要隐藏你的控制器依赖于Files的事实?这里唯一的问题是,特别是对于控制器,所有类的方法并不总是使用许多依赖项。这更像是一个性能问题,你可以想到以多种方式解决它(例如: Action object)。

选择适合您的方式。