Modalități de conectare a comportamentului în yii2

Comportamentul nu este doar o ocazie de a închide un eveniment pe o acțiune, ci și un instrument puternic care oferă oportunități nelimitate de reutilizare a codului. Frumusețea comportamentului este că pot fi atașate de orice. De exemplu: dacă toate modelele utilizează metoda updateItem (), o puteți lua într-o clasă separată și moșteniți de la ea toate modelele. Și ce se întâmplă dacă metoda poate fi nu numai modelul, ci și controlerul sau vizualizarea? Dacă nu toate modelele au nevoie de acces la metoda generală? Pentru a ajuta comportamentul.
Am scris deja despre comportament. despre ce evenimente pot fi atârnate de ei. Trebuie să scriem cum să creăm noi aceste evenimente, dar astăzi vom vorbi despre modalitățile de atașare a comportamentelor la obiect.

Metoda 1: legarea de la controler

În acest exemplu, după conectarea utilizatorului, metoda setUserInfoInSession este apelată în modelul Utilizator

Metoda 2: Legarea la nivel de obiect

Prima metodă este bună, când trebuie să legați comportamentul într-o anumită acțiune în anumite condiții. Pentru propria mea sarcină, este suficient să se conecteze comportamentul la nivelul modelului Utilizator.

În exemplul de mai sus, sunt conectate 3 comportamente. Două dintre ele printr-o clasă separată, iar ultima sub forma unei funcții anonime. Dacă faceți o clasă separată, atunci se extinde modelul, că metodele publice din această clasă sunt disponibile din model. De asemenea, în clasă, puteți seta comportamentul comportamentului la eveniment.
Exemplu de comportament DateTimeBehavior.

Prin conectarea acestei clase la model, primesc un apel la metode convertDate și convertDateToDB după găsirea înregistrării și înainte de validare.
Puteți comporta comportamentul în acest fel pentru orice clasă, inclusiv controlerul.

Metoda 3: obligați din config

Puteți înregistra un eveniment în config, în setările componentelor.

Vă puteți conecta în aceleași trei moduri: ca apel global de funcții, apel dintr-un obiect sau ca funcție anonimă. În exemplul meu, apelați metoda de clasă.
Rămâne doar să ne amintim că cererea în sine este, de asemenea, un obiect care are propriile sale evenimente. De asemenea, este posibil să conectați comportamente la acesta

Bună seara
Indicați cum să faceți acest lucru corect.
Există 2 module:
În modelul 1 al Utilizatorului și în cel de-al doilea comportament SomeBehavior
Este necesar să adăugați acest comportament nu pentru un utilizator specific $ user, ci pentru toți, așa cum a fost, adăugându-l pur și simplu la metoda comportamentelor () a modelului Utilizator.
Modulul 1 este independent de cel de-al doilea

Deci văd două moduri:
1) Afișați comportamentul modelului Utilizator în config:
într-un fel dur cum ar fi:
Utilizator clasa ...
comportamente () retur array_merge ([
...
], Yii :: $ app-> params ['userBehaviors']);
>
>

dar în modulul 2:
clasa Module2 implementează BootstrapInterface
funcția publică bootstrap ($ app) $ app-> params ['userBehaviors']. [];
$ app-> params ['userBehaviors'] ['myBehavior'] = MyBehavior :: className ();
>
>

Și 2 mod de a captura evenimentul AFTER_FIND de la utilizator și adăugați prin attachBehavior ()
Această metodă pare mai rea decât prima

Cea de-a doua cale este mai puțin transparentă decât prima, prima care îmi place cel mai mult. Podbroschu o altă idee: adăuga evenimente provocare comportamente ($ this-> declanșare (...)) și permite oricui să difuzeze stivuitoare lor. De asemenea, nu transparent, dar mai flexibil (comportament poate fi difuzat fără un permis de ședere în fișierul de configurare, este util să se integreze cele două părți ale modulelor, atunci când rescrierea clasa de oricare dintre ele poate moștenire numai).

Articole similare