DbInjectionAware formularz w Phalconie

Pisząc pewien projekt w Phalconie, natknąłem się na sytuację gdy formularz musiał mieć validator Uniqueness. Oczywiście taki validator istnieje, ale w modelach: Phalcon\Mvc\Model\Validator\Uniqueness. Niestety postanowiłem nie korzystać z phalconowych modeli z powodu łamania zasady SOLID.

Pomysł

Wpadłem na pomysł aby stworzyć własny validator, który by korzystał z połączenia Db i sprawdzał czy podana wartość już istnieje w bazie. Tutaj jednak pojawiło się pytanie: w jaki sposób wstrzyknąć instancje połączenia z bazą danych do validatora?

Pierwszym pomysłem było skorzystanie z Dependency Injection w Phalconie jako Service Locator. Jednak uważam że o ile można, to należy omijać Service Locatora. Z tego powodu postawiłem rozwiązać problem trochę okreżną drogą, ale za to łatwo testowalną.

Rozwiązanie

Rozwiązaniem jest połączenie własnego FormManagera oraz Interfejsu DbInjectionAwareInterface.

Moja wersja Form Managera sprawdza przy tworzeniu formularza czy implementuje on DbInjectionAwareInterface, jeżeli tak to wstrzykuje do formularza instancje db.

Dodatkowo jeżeli formularz posiada metodę configure to jest ona odpalana przed zwróceniem obiektu formularza. Jest to spowodowane tym, że wbudowana metoda initialize() jest odpalana podczas startu konstruktora. W konstruktorze nie ma jeszcze dostępu do wstrzyknietej instancji db. Z tego powodu dodałem obsługę metody configure.

Teraz wystarczy tylko odpowiednie zmiany w DI aplikacji

Oczywiście aby się nie powtarzać RegisterForm może dziedziczyć po klasie która ma zaimplementowany DbInjectionAwareInterface. Jednak ja napisałem do tego traitsa:

No i na koniec wykorzystanie traitsa w klasie formularza:

Autor zdjęcia: Philip Taylor

Developer, wiecznie poprawiający swój własny kod. Nie wyobraża sobie pracy bez GitHuba i Jiry. Uwielbia książki fantasy, Go oraz granie w badmintona.

Send this to a friend