在Symfony2中放置模型助手函数的位置

Jas*_*ett 8 php symfony

我有以下功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

此功能显然不适用于任何特定模型,并且它不是模板助手.放置此功能的适当位置在哪里?(请不要说"你想要的任何地方.")

Tho*_*ley 13

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

class ArrayUtils
{
    function array_duplicates($array)
    {
        ... 
        return $duplicates;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其定义为服务.如果你正在使用YAML,你可以将这样的东西放到你的config.yml文件中:

services:
    arrayUtils:
        class:        Full\Path\To\ArrayUtils
Run Code Online (Sandbox Code Playgroud)

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

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

这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)