2016-06-22 13 views
5

Patrząc na źródło laravel, zauważyłem wiele rzeczy tak:Jaki jest wzór cechy Laravel?

Klasa kontrolera:

class Controller extends BaseController 
{ 
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests; 
} 

Jedną z jej składowych cech:

trait AuthorizesRequests { 

    /** 
    * Authorize a given action against a set of arguments. 
    * 
    * @param mixed $ability 
    * @param mixed|array $arguments 
    * 
    * @return \Illuminate\Auth\Access\Response 
    * 
    * @throws \Illuminate\Auth\Access\AuthorizationException 
    */ 
    public function authorize($ability, $arguments = []) { 
     list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments); 
     return app(Gate::class)->authorize($ability, $arguments); 
    } 

    // ... 

} 

Mam kilka pytań na ten temat:

  • Czy ten wzorzec (abstrahując funkcję ponownego użycia w cechy) ma nazwę?
  • Czy ten wzór był dobrze stosowany w innych projektach?
  • Jeśli cecha wymaga zależności, czy istnieje najlepszy sposób ich wstrzyknięcia, zamiast korzystania z lokalizatora usług (np. app(), w tym przypadku)?

Jestem rozważa wykorzystanie tej metody w moim kodu, aby podzielić się ogólną funkcjonalność między kilka moich zajęć - Zastanawiam tworząc ChecksBarcodes cechę, która będzie pracować z repozytorium informacji o stanie, i że dzielenie cecha kilku podobnych, ale niepowiązanych klas procesów zarządzania produktami, które wszystkie muszą sprawdzać kody kreskowe.

Odpowiedz

1

Cechy, wprowadzane przy pomocy PHP 5.4, ogólnie rozwiązujące jeden duży problem z 0123:PHP: pojedyncze dziedziczenie. Zgaduję, że jeśli PHP będzie obsługiwać dziedziczenie wielowarstwowe (odziedziczone po więcej niż jednej klasie), nie będzie żadnych cech.

Niemniej jednak, cechy są dobrą rzeczą do zmniejszenia duplikacji kodu, a ponadto zapewniają tę samą funkcjonalność dla wielu klas.

  • O ile widzę, nie ma prawdziwej nazwy (wzoru) dla używania cech.
  • To nie jest wzór per se, w porównaniu do innych wzorca projektowania oprogramowania, po prostu nazwać cech;)
  • laravel a może bardziej konkretnie pakiet kasjera są dobrymi przykładami wykorzystania cech. Jeśli ktoś znajdzie inne dobre przykłady, wspomnij o tym.
  • Cechy mogą być rozszerzone o inne cechy. To oczywiście powoduje coraz większą złożoność. Aby przedłużyć czas, prawdopodobnie powinieneś rozważyć inne metody, aby wprowadzić funkcjonalność do swojej klasy. "Łańcuchowanie" cech dodaje obciążenia złożoności.
2

cechy są podobne do wydłużania klas, ale z kilkoma różnicami

  • cechy nie mają konstruktora
  • Klasy mogą tylko przedłużyć jedną klasę, ale mają wiele cech

Są podobne do miksów w innych językach. Sądzę, że można powiedzieć, że jest to łatwy sposób na użycie DRY principle.

Ponieważ cechy nie mają konstruktorów, wszelkie zależności, które mają, muszą istnieć w klasie, w której są używane. Myślę, że w zależności od tego, że klasa ma coś innego niż cecha, będzie to zły wzór. Więc będziesz musiał użyć lokalizatora usług, aby pobrać zależności.

Jeśli nie chcesz używać lokalizatora usług, polecam używanie klasy zamiast cechy. Możesz mieć klasę BarcodeChecker, którą możesz wprowadzić do konstruktora klas, z których chcesz go użyć. Wtedy zamiast $this->checkBarcode() użyjesz $this->barcodeChecker->check(). Myślę, że byłby to lepszy wzór, jeśli cecha wymaga zależności.

+0

Co sądzisz o przeniesieniu zależności od klasy na cechę poprzez samo wywołanie funkcji? '$ this-> checkBarcode (zależność $, kod kreskowy $);' Wydaje się inną możliwością, ale kludgey. Czy sie zgadzasz? – Alex

+1

Tak, wydaje mi się to mniej przydatne. Jeśli robisz to w ten sposób, każda klasa, która dziedziczy tę cechę, musi mieć zależność ręcznie wstrzykniętą, pokonując cel wydobywania powtarzających się zachowań. – Jeff

+0

Wielkie dzięki za twoje myśli, Jeff. @ kodedge i oboje odpowiadaliście na oddzielne części pytania, więc gdybym mógł przyjąć obie odpowiedzi, zrobiłbym to! Postanowiliśmy zaakceptować drugą odpowiedź, ponieważ wiąże się ona bardziej z ogólnym tytułem pytania niż z dyskusją o zależnościach. – Alex