10

我有以下功能:

function array_duplicates($array)
{
    $duplicates = array();
    $unique = array_unique($array);
    for ($i = 0; $i < count($array); $i++) {
        if (!array_key_exists($i, $unique)) {
            $duplicates[] = $array[$i];
        }   
    }   
    return $duplicates;
}

该功能显然不适用于任何特定模型,也不是模板助手。放置此功能的合适位置在哪里?(请不要说“任何你想去的地方”。)

4

2 回答 2

15

这可能是您要投入服务的类型。像这样创建一个类:

class ArrayUtils
{
    function array_duplicates($array)
    {
        ... 
        return $duplicates;
    }
}

然后将其定义为服务。如果你使用 YAML,你会在你的 config.yml 文件中加入这样的东西:

services:
    arrayUtils:
        class:        Full\Path\To\ArrayUtils

在这种配置下,Symfony 将创建 ArrayUtils 的单个实例,并授予所有控制器访问它的权限。然后你可以这样称呼它:

class SomeController
{
    public function someAction()
    {
        ...
        $duplicates = $this->get("arrayUtils")->array_duplicates($array);
        ...
    }
}

这都是 Symfony 依赖注入框架的一部分。这很酷,我建议在这里阅读:http ://symfony.com/doc/2.0/book/service_container.html

替代选项

现在,对于这么一小段代码来说,这可能有点矫枉过正。如果您只打算在单个捆绑包中使用它,那么您可能只想将其放入基本控制器中,并让所有其他控制器扩展该基本控制器。

class BaseController
{
    function array_duplicates($array)
    {
        ...
    }
}

class SomeController extends BaseController
{
    function someAction()
    {
        $this->array_duplicates($array);
    }
}
于 2012-10-04T18:02:46.567 回答
3

按照惯例,实用程序类位于Util命名空间下。

如果你使用包,一个类将进入YourBundle\Util命名空间。如果你不这样做,它将进入Acme\Util命名空间——src/Acme/Util文件夹。

于 2012-10-04T18:09:43.887 回答