2016-07-20 7 views
1
<?php 
class Entity { 
    /** 
    * @var array|stdClass|Collection|string 
    **/ 
    private $mixed; 
    public function getMixedAsPhpArray(array $filter) { 
     return EntityHelper::toPhpArray($this->mixed, $filter); 
    } 
} 

、どうやってたPHPDocブロック内の型のいずれかによって$mixedをしたと仮定するとEntityHelper::toPhpArrayへの静的呼び出しを削除しますか? (これは、私が「汚れを取り除いてから取り除く」機能を持っているところでは、私が直面している問題の単純な例です)(私はEntityにこの機能を必要とし、Abstrart Entity彼らは既に様々な他のものを拡張しているので、この方法で)。エンティティの静的メソッドを置き換えるPHP、ベストプラクティス

私はSymfonyを使用していて、ヘルパーでDIを考えていましたが、すべてnew Entityをサービスコンテナの呼び出しに置き換えると、悪い(遅い)アイデアになります。もう一つのアイデアは、汚れた出力を返し、それをきれいにしてフィルタリングするサービスを使用することですが、Entityのすべてのデータをアプリケーションに入れてからサービスに取り込むというのは悪い考えです1つは行くと間違いを(と多分メモリの使用...)を削除します。

+0

なぜそれを削除しますか?そのまま内部に残しますが、方法が単体テストで覆われていることを確認してください。 –

答えて

1

最良のソリューションは、アプリケーションに依存しますが、あなたが使用する可能性のある方法は、形質であなたのヘルパーコードを置くことです:

まあ
<?php 

trait ArrayCleaner { 

    public function toPhpArray($dataToFilter, $filterArray) { 
    // ... your code here 
    } 
} 

class Entity { 
    use ArrayCleaner; 

    /** 
    * @var array|stdClass|Collection|string 
    **/ 
    private $mixed; 
    public function getMixedAsPhpArray(array $filter) { 
    return $this->toPhpArray($this->mixed, $filter); 
    } 

} 

http://php.net/manual/en/language.oop5.traits.php

1

、あなたでこれを行うことができますa trait

trait EntityHelperTrait 
{ 
    private function toPhpArray($value, $filter) { 
     // body of method 
    } 
} 

class Entity 
{ 
    use EntityHelperTrait; 

    /** 
    * @var array|stdClass|Collection|string 
    **/ 
    private $mixed; 
    public function getMixedAsPhpArray(array $filter) { 
     return $this->toPhpArray($this->mixed, $filter); 
    } 
} 

あなたの(確かに単純化された)例に基づいて、あなたは責任を混同しています。これが本質的であるタイプ変換の仕事は、Entityクラス自体に組み込まれていない別の場所に属するはずです。

エンティティが他のコンポーネントの「汚れた」出力をフィルタリング/クリーン/何でも返すようにするのはまったく問題だと思います。

+0

私もこのことを考えましたが、私はこの記事を覚えていたので、それはそれほど良くはないと私は思っていませんでした。 TL:DR;形質は静的メソッドであり、 '$ this'を魔法の引数としています。 http://www.whitewashing.de/2013/04/12/traits_are_static_access.html – TheNextBigThing

+0

オハイオ州私は同意するが、私は一般的に私ができるなら形質を避ける。だから私はエンティティからデータを返し、それを変換するために何か他のものを使うのはいいとも言いました。あなたは良いデカップリングを得るためにコマンドバスやパイプラインのようなものを考えることができます –

関連する問題