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 に答える