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

die obige Klasse gegeben, wie würden Sie den statischen Aufruf zu EntityHelper::toPhpArray Annahme $mixed konnte durch eine der Arten im PHPDoc-Block entfernen? (Dies ist nur ein vereinfachtes Beispiel für ein Problem, das ich habe, wo ich eine Funktion habe, "dreckig rein und raus") (Ich kann es der Entität nicht hinzufügen, da viele Entitäten diese Funktion benötigen und nicht von einer Entität abtretten können mit dieser Methode, wie sie bereits verschiedene andere erweitern).Ersetzen PHP statische Methoden in Entities, Best Practices

Ich benutze Symfony und dachte an DI in den Helfer, aber alle new Entity mit einem Aufruf an den Service-Container zu ersetzen wäre eine schlechte (und langsame) Idee. Eine andere Idee wäre, die schmutzige Ausgabe zurückzugeben und einen Dienst zu verwenden, um ihn zu säubern und zu filtern, aber ich denke auch, dass das eine schlechte Idee ist, da alle Daten von der Entität in die Anwendung und dann in den Dienst übernommen werden gehen Sie und entfernen Sie Fehler (und vielleicht Speicherverbrauch ...).

+0

Warum möchten Sie es entfernen? Lassen Sie es intern so wie es ist, aber stellen Sie sicher, dass die Methode mit Unit-Tests abgedeckt ist. –

Antwort

1

Die beste Lösung für Ihre Anwendung ab, aber eine Methode, die Sie verwenden könnte, ist Ihr Helfer-Code in einem Zug zu setzen:

<?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

Nun, Sie könnte tun dies mit 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); 
    } 
} 

Aber basierend auf Ihrem (zugegebenermaßen vereinfachten) Beispiel mischen Sie Verantwortlichkeiten. Die Aufgabe der Typkonvertierung, die im Wesentlichen darin besteht, sollte woanders hingehören und nicht in die Entity-Klasse selbst eingebettet sein.

Ich denke, es ist völlig in Ordnung, die Entity die "schmutzige" Ausgabe für eine andere Komponente zurückgeben zu filter/clean/was auch immer.

+0

Ich dachte auch darüber nach, aber ich dachte nicht, dass es besser wäre, wenn ich mich an diesen Artikel erinnere. TL: DR; Traits sind statische Methoden mit '$ this' als magischem Argument. http://www.whitewashing.de/2013/04/12/traits_are_static_access.html – TheNextBigThing

+0

Oh ich stimme zu, ich vermeide Eigenschaften generell, wenn ich kann. Deshalb habe ich auch gesagt, dass es gut wäre, die Daten von der Entität zurückzugeben und etwas anderes zu verwenden, um sie zu transformieren. Man könnte etwas wie einen Befehlsbus oder eine Pipeline betrachten, um eine gute Entkopplung zu erreichen –