Próbuję użyć Service Manager na mojej klasie encji, ale nie wiem najlepszy sposób to zrobić.Najlepszy sposób użycia ServiceManager w klasie modelu?
To proste dla kontrolera, ponieważ możemy zadzwonić do menadżera serwisu za pomocą: $ this-> getServiceLocator();
Ale w mojej klasie jednostki, nawet jeśli realizuje ServiceLocatorAwareInterface mogę retieve ServiceManager ponieważ moja klasa jednostka nie jest zadzwonić do kierownika serwisu:
Więc co jest najlepszym sposobem:
1 - Przekaż usługę serviceManager w mojej klasie encji z mojego kontrolera 2 - Za pomocą ServiceManager zbuduj moją klasę jednostek 3 - ...?
Aby jak najlepiej zrozumieć mój problem, to jest mój kod, który nie działa:
Moja klasa podmiot:
class Demande extends ArraySerializable implements InputFilterAwareInterface {
/../
public function getUserTable() {
if (! $this->userTable) {
$sm = $this->getServiceLocator();//<== doesn't work !
$this->userTable = $sm->get ('Application\Model\UserTable');
}
return $this->userTable;
}
Bardzo przydatna odpowiedź! Innym powodem, dla którego nie należy wstrzykiwać ServiceManager do modelu, jest to, że nie możemy serializować naszego obiektu (z powodu zamknięć w ServiceManager). Nie możemy więc zapisywać modeli w sesji. –
Jedyną rzeczą, którą należy dodać, jest to, że nie powinieneś zbytnio nadużywać "zamknięcia". Zamiast tego pisz klas fabryki. Poprawi to ogólną wydajność, ponieważ klasy będą tworzone tylko na żądanie. Wszystkie zamknięcia będą tworzone na każde żądanie. – Sam
Jeszcze jedno: jeśli pewne zależności są absolutnie ** wymagane **, to bardzo zachęca się do używania '__construct()' lub zastrzyku zamiast Settera-Injection – Sam