Where to put model helper functions in Symfony2

2020-07-06 05:52发布

I have the following function:

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;
}

This function obviously doesn't apply to any certain model, and it's not a template helper. Where would be the appropriate place to put this function? (Please don't say "anywhere you want.")

标签: php symfony
2条回答
Evening l夕情丶
2楼-- · 2020-07-06 06:40

This might be the type of thing you'd put into a service. Create a class like this:

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

And then define it as a service. If you're using YAML, you'd put something like this into your config.yml file:

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

Under this configuration, Symfony will create a single instance of your ArrayUtils, and give all your controllers access to it. Then you can call it like this:

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

This is all part of Symfony's dependency injection framework. It's pretty cool, and I recommend reading up on it here: http://symfony.com/doc/2.0/book/service_container.html

Alternative Option

Now, that might be a little overkill for such a small chunk of code. If you're only going to be using this in a single bundle, then you might want to just put it into a base controller, and have all your other controllers extend that base controller.

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

class SomeController extends BaseController
{
    function someAction()
    {
        $this->array_duplicates($array);
    }
}
查看更多
老娘就宠你
3楼-- · 2020-07-06 06:41

By convention, utility classes go under the Util namespace.

If you use bundles, a class would go into the YourBundle\Util namespace. If you don't, it would go into the Acme\Util namespace — the src/Acme/Util folder.

查看更多
登录 后发表回答