Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Symfony2中放置模型辅助函数的位置_Php_Symfony - Fatal编程技术网

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

Php 在Symfony2中放置模型辅助函数的位置,php,symfony,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]; }

我有以下功能:

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;
}
函数数组\u重复($array)
{
$duplicates=array();
$unique=array\u unique($array);
对于($i=0;$i

这个函数显然不适用于任何特定的模型,而且它不是模板助手。将此功能放在哪里合适?(请不要说“你想去的任何地方”。

这可能是你在服务中投入的东西。创建如下所示的类:

class ArrayUtils
{
    function array_duplicates($array)
    {
        ... 
        return $duplicates;
    }
}
class SomeController
{
    public function someAction()
    {
        ...
        $duplicates = $this->get("arrayUtils")->array_duplicates($array);
        ...
    }
}
然后将其定义为服务。如果您使用的是YAML,您应该在config.yml文件中放入如下内容:

services:
    arrayUtils:
        class:        Full\Path\To\ArrayUtils
在此配置下,Symfony将创建ArrayUtils的单个实例,并允许所有控制器访问它。然后你可以这样称呼它:

class ArrayUtils
{
    function array_duplicates($array)
    {
        ... 
        return $duplicates;
    }
}
class SomeController
{
    public function someAction()
    {
        ...
        $duplicates = $this->get("arrayUtils")->array_duplicates($array);
        ...
    }
}
这是Symfony依赖注入框架的全部组成部分。这很酷,我建议在这里阅读:

备选方案

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

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

class SomeController extends BaseController
{
    function someAction()
    {
        $this->array_duplicates($array);
    }
}

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


如果使用bundle,则类将进入
YourBundle\Util
命名空间。如果您需要,它将进入
Acme\Util
名称空间,即
src/Acme/Util
文件夹。

我不熟悉Symphony,因此无法回答您的问题,但我可以说,如果您在该项目中遇到性能问题,此方法将是瓶颈之一。在for循环中,每次迭代都要计算数组长度,这是一个相当繁重的过程。您需要预先计算它,并在循环中使用变量。顺便说一句,在大多数情况下,
foreach循环比
for
@PLB略快,虽然预先计算阵列的长度总是好的,但可以说这是一个瓶颈。循环中没有查询(或其他通常较慢的操作);你也不知道数组的大小。它可以是一个包含10个左右元素的数组,在这种情况下,即使每次迭代都要重新计算数组的长度,也不会花费太长的时间来运行。@ascii lime当您正在创建将发布的项目时,您应该创建尽可能灵活的代码。您不知道何时需要重新考虑代码。对于性能而言,每毫秒都很重要。在开发的第一阶段,如果性能“损害”了代码的可读性,我不会去追求性能,但在其他方面,您应该尽最大努力避免像这样的潜在瓶颈。很快,当你能写更好的代码时,就写吧,依我看。我会把代码放在文件系统的什么地方?或者换句话说,我会把代码放在项目目录的什么地方?好吧,真正的答案是:你想放在哪里就放在哪里。不过为了简化工作,我总是在包目录下保留一个名为“Service”的目录,并将所有服务放在那里。所以这个类应该是:\SomeBundle\Service\ArrayUtils.Thank。更具挑战性的是,我需要在实体中使用
array\u duplicates()。所以我必须将一个
ArrayUtils
实例传递给使用该函数的实体?如果是这样的话,这似乎是站不住脚的。我想这是另一个问题。可能吧,但这感觉像是一个黑客。此数组util与实体无关。