![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Prośba o pomoc.
mam zdefiniowany dodatek w services:
Jak zrobić aby metoda setTranslatableLocale dostawała parametr z sesyjnego getLocale? Teraz parametr jest pobierany bezpośrednio z parametrs.ini, a ja chcę aby tam trafiała wartość z sesji... Przy wielojęzyczności zmiany krajów powinny być transparentne dla systemu i wiem, że można sobie uruchamiać setTranslatableLocale w kontrolerze, ale mi chodzi o automat i service container. Ten post edytował blackroger 29.03.2013, 13:00:55 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Przy przekazaniu:
Wyrzuca błąd: ScopeWideningInjectionException: Scope Widening Injection detected: The definition "gedmo.listener.translatable" references the service "request" which belongs to a narrower scope. Generally, it is safer to either move "gedmo.listener.translatable" to scope "request" or alternatively rely on the provider pattern by injecting the container itself, and requesting the service "request" each time it is needed. In rare, special cases however that might not be necessary, then you can set the reference to strict=false to get rid of this error. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Treść błędu zawiera klarowne wyjaśnienie i możliwe rozwiązania. Nie mniej jednak przeczytaj sobie poniższy artykuł: http://symfony.com/doc/master/cookbook/ser...ner/scopes.html
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Hmmm... czytałem już ten artykuł ale do mojego przypadku nie za bardzo mogę dostosować którąś z opcji.
Class Gedmo\Translatable\TranslatableListener nie mogę w żaden sposób zmieniać, ani dodać settera (setter injection), ani grzebać w konstruktorze. Czytając po forach niektórzy sugerują uzycie dodatkowej klasy np. RequestInjector, która tworzyłaby funkcję serwisu proxy dla request:
Mam pytanie. Czy istnieje możliwość wywołania metody bezpośrednio na service?
Czy da się tak zrobić, aby zwrócić do metody setTranslatableLocale sama wartość, poprzez wywołanie metody na RequestInjector? I czy to nie kłóci się z logiką services? Ten post edytował blackroger 31.03.2013, 11:26:23 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Musiałbyś tutaj skorzystać z service-factory i factory-method. Zawsze jednak możesz utworzyć swoją własną klasę, dziedziczącą po Gedmo\Translatable\TranslatableListener dodać jej settera, który przyjmuje RequestInjectora i wywołuje dziedziczoną setTranslatableLocale().
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Heh ...właśnie tak to załatwiam...TranslatableListenerService dziedziczący po TranslatableListener rozszerzający o setRequest....
Dobra nadal nie działa jak powinno....ehhh.... TranslatableListenerService:
RequestInjector:
services.yml:
Nadal nie jest tak jak powinno. Przy clear cache: [Symfony\Component\DependencyInjection\Exception\InactiveScopeException] You cannot create a service ("request") of an inactive scope ("request"). Pomocy... Ten post edytował blackroger 31.03.2013, 19:48:05 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Ponieważ próbujesz odwołać się do usługi request w momencie gdy nie jest ona dostępna. Wywołanie akcji z poziomu konsoli nie tworzy usługi request, nie tworzy w ogóle całego zasięgu request. Co musisz zrobić? Przed zwróceniem usługi request z poziomu RequestInjectora, sprawdź czy zasięg (scope) request jest w ogóle dostępny i aktywny przy pomocy ContainerInterface::isScopeActive().
Co zrobić w przypadku gdy nie jest? Metoda getLocale() może z powodzeniem zwrócić parametr default_locale, zaś metoda getRequest() powinna zwrócić NULL. Tutaj trzeba od razu zwrócić uwagę, że w przypadku gdy istnieje możliwość, że zamiast jakiejś usługi zostanie zwrócony NULL w definicji usługi korzystającej z owej niepewnej zależości powinno dodać się onInvalidReference=ignore. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 27.09.2025 - 08:14 |