Siema mirki.
Robię taką trochę owijkę legacy code w komponenty symfony. Aktualnie jestem na etapie implementacji wstrzykiwania serwisów jako zależności do kontrolerów. Jednak w żadem sposób nie mogę wymusić automatycznego wstrzykiwania zależności (autowiring, autoconfigure), wszystko muszę opisywać w pliku services.yml, a i tak nie będę mógł później tego wstrzyknąć jako zależności do kontrolera.
Może ktoś, kto grzebał głębiej w symfony, będzie potrafił mi pomóc z tym?
W celu ułatwienia sprawy, dodaję repo na githubie: https://github.com/miedzwin/legacy-framework
Oraz wątek na stackoverflow: https://stackoverflow.com/questions/52221321/symfony-4-1-components-dependency-injection-issues

EDIT:
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mariecziek: Twoja usługa TestService też musi być zdefiniowana w services.yaml ze wszystkimi zależnościami i dopiero może być wstrzykiwana do kontrolera czy innych usług (tutaj public: true)
  • Odpowiedz
@picios: Tak, wiem, ale jeżeli w services.yml mam ustawione autowire: true, to wszystkie serwisy są ładowane do kontenera z tego pliku. Nie muszę tam rejestrować serwisów, jak to było w Symfony <3.3. One są rejestrowane automatycznie, na podstawie tego co jest zapisane w services.yml w linijkach 13-15. Mógłbym się z tobą zgodzić, gdyby do serwisu byłyby przekazywane jakieś argumenty w konstruktorze, ale serwis nie posiada konstruktora.
Kolejną rzeczą jest to, że kontrolery są zarejestrowane też jako serwisy, więc wstrzykiwanie powinno działać jako: wstrzykiwanie zależności, jednego serwisu do drugiego. Niestety metoda w klasie ControllerResolver wygląda tak:

protected function instantiateController($class)
{
  • Odpowiedz
Czy są na wykopie specjaliści od #symfony #symfony3 ?
Mam apkę w legacy code, którą refaktoruję na coś znośnego. Jest już router, wprowadziłem też kontener DI, pobieram z niego serwisy w kontrolerze (przed wywołaniem kontrolera wstrzykuję kontener do kontrolera). Mogę sobie też pobierać parametry w kontrolerach i przekazywać je do serwisów.
Mam jednak pewien problem:
Otóż nie mogę sobie wstrzyknąć serwisu do kontrolera jako argument metody. Jak próbuję to zrobić to rzuca mi wyjątkiem:

Controller "APP\V2\Controller\API\TestController::initAction()" requires that you provide a value for the "$facebookService" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mariecziek: Jeśli masz komponenty symfony/debug i symfony/console to zadziała :) Ale ok, rozumiem.

Ten kod który masz teoretycznie powinien działać po przeniesieniu zależności do kontrolera, ale widać coś jeszcze jest nie tak. Winy szukałbym w services.yml. Może zła ścieżka? Sprawdź też może czy inne serwisy, nie będące kontrolerami działają - utwórz jakiś, który miałby korzystać z tego FacebookService i sprawdź czy jest poprawnie inicjalizowany. Jeśli zadziała, to wina może leżeć
  • Odpowiedz
Hejo!
Wiesz może jak wymusić konkretny separator dziesiętny (np. kropkę) niezależnie od aktualnie ustawionego locale dla MoneyType? Byłbym wdzięczny za wskazówki. Obojętnie czy przez kontroler, formularz czy Twig.
#symfony #symfony4 #symfony3 #symfony2
  • 12
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Tworzę stronę do faktur na zaliczenie (w Symfony3) i chciałbym stworzyć raport podsumowujący zysk/stratę miesiąc po miesiącu. Niestety moim sposobem (podanym poniżej) nie wyświetlają się miesiące dla których nie ma rekordów (np. w lutym nie było wydatków ani zysków to wyświetl w lutym 0).

//query to generate profit report
$query=$entityManager->getRepository(Invoice::class)
->createQueryBuilder('i')
->select(' sum(i.netValue) AS netSum, MONTH(i.createDate) AS month, YEAR(i.createDate) AS year, i.incoming AS incoming')
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Meteor100: Long story short .dist jest czytany w momencie composer install bo na podstawie niego (i pytań zadanych userowi) tworzy/aktualizuje parameters.yml. Więc albo w parameters.yml albo parameters.yml.dist masz błąd składni.
  • Odpowiedz
Mirki od #symfony #symfony3 mam problem z EasyAdmin + VichUploader. Mam taką konfigurację: https://pastebin.com/DShPAujw i rzuca mi błędem: [Symfony\Component\DependencyInjection\Exception\RuntimeException]
Service "Vich\UploaderBundle\Naming\UniqidNamer.resource_images": Parent de
finition "Vich\UploaderBundle\Naming\UniqidNamer" does not exist.

Nie wiem dlaczego nie widzi tej klasy, leży sobie w vendor, a cały bundle jest włączony w AppKernel.
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

a na której wersji Symfony siedzisz i którą wersje Vich masz? bo nazewnictwo Vich\UploaderBundle\Naming\UniqidNamer jest od vich 1.8 które jest dla wersji Symfony 3.4/4.0.
W poprzednich wersjach Vich, które były dla starszych Symfony masz vich_uploader.namer_uniqid
Dla porównania:

https://github.com/dustin10/VichUploaderBundle/blob/1.7.1/Resources/doc/namers.md
https://github.com/dustin10/VichUploaderBundle/blob/1.8.0/Resources/doc/namers.md
  • Odpowiedz
Mirki, w jaki sposób serializujecie encje do JSONa?
Otóż mam sobie projekt na symfony 3.4. Mam zapytania ajaxem, które w odpowiedzi oczekują JSONa. Otóż jak otrzymałem ten projekt, to ktoś zwyczajnie w encji ustawił atrybuty klasy na public, bo wtedy można zamienić klasę na json przy pomocy json_encode. No ale moim zdaniem to jest bardzo zły pomysł. Postanowiłem skorzystać z Serializera od Symfony, jednak mam taki problem, że ciągle otrzymuję
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

#symfony4 #symfony #symfony3 #symfony2

Hej Mirasy,
wiecie może czy da się i jak to zrobić, aby impersonować użytkownika pod jednym firewallem (usługi klientów), ale nadal zachować poprzedniego (admina) pod innym firewallem (panel administracji)?
W tej chwili przełącza użytkownika całkowicie i tracę dostęp do admina, podczas gdy chciałbym impersonalizację wyłącznie od frontu.
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Hej Mirasy.
Mam problem z konfiguracją w Symfony 4.
Potrzebuję nadpisać dbname dla connection default zdefiniowanego w config/packages/doctrine.yaml
Wrzucam je do config/packages/test/doctrine.yaml i nie nadpisuje mi jej przy odpaleniu środowiska testowego, niezależnie czy jest dodane jako doctrine:dbal:dbname czy doctrine:dbal:connections:default:dbname. Zastanawiam się czy to bug czy robię coś nie tak. W przypadku poprzednich wersji SF z config_test.yml to działało.

Dodam, że działa mi to "dobrze" jeśli zdefiniuję dodatkowe connection "test" w config/packages/doctrine.yaml i wtedy w config/packages/test/doctrine.yaml mogę nadpisać doctrine:dbal:default_connection:test. No ale w przypadku definiowania wielu połączeń chciałbym mieć możliwość nadpisania fragmentu ich konfiguracji dla środowiska testowego, bez pełnego definiowania nowych połączeń testowych i zaśmiecania pliku konfiguracyjnego doctrine ze środowiska dev
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Uczę się Symfony3 z poradnika ze strefakursow.pl i tam w pierwszym przykładzie mam skorzystać z gotowego szablonu o nazwie Auction/index.html.twig . Niestety przepisując kod z poradnika, strona nie działa wyrzucając błąd 500 :/

Co mogłem zrobić nie tak?
pastebin projektu

#webdev #symfony3 #php
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Mirki, potrzebuję pomocy. Trzeci dzień próbuję rozwiązać pewien problem i w żaden sposób mi się to nie udaje.

Powiedzmy mam 2 encje: Post i Tag. W encji Tag, w bazie danych mam zapisane tagi. Mogę je dodawać, mogę je usuwać. Każdy Post może mieć wiele tagów, ale tylko tych z listy tagów. Nie ma żadnego dynamicznego dodawania czy usuwania tagów. Tak więc zrobiłem to relacją ManyToMany. jednak przy próbie aktualizacji Posta, rzucało wyjątek: Duplicate key entry. Ogólnie chodzi o to, że podczas aktualizacji, stare rekordy nie były usuwane, a była próba wstawienia takiego samego rekordu jaki już istnieje.
No dobra. Zmieniam relację. Robię OneToMany - ManyToOne, z encją posrednią PostHasTag. No i teraz mam kolejny problem, bo nie wiem w jaki sposób zrobić formularz, gdzie będę miał listę tagów z bazy danych i bedę je mógł wybierać (checkbox). Próbowałem już robić:

$builder->add('posthastag', EntityType::class);
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Cześć. Kupię konsultacje z #symfony2 lub #symfony3
Muszę w ciągu kilku miesięcy zaprogramować aplikację webową. Sporo na pewno ogarnę sam, ale nic tak mi nie pomaga jak możliwość zadania kilku dziwnych pytań komuś z doświadczeniem. Zależy mi na opcji komunikacji mailowej i czatowej z gwarancją uzyskania choćby naprowadzającej odpowiedzi w ciągu kilku godzin (w dzień roboczy). Dostępność w weekend mile widziana, ale nie konieczna. Uczciwie będzie chyba rozliczać
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mariecziek: Jak chcesz zmienić wygląd danego pola to musisz nadpisać jego wygląd podobnie jak zrobiłeś to tutaj http://www.textsnip.com/kiokh0 . Zastanawia mnie jak to się stało, że działa Tobie to nadpisanie jak na końcu jest options, ale to chyba jest jakieś specyficzne zachowanie przy radio. Jak masz klasę EntityType to powinieneś nadpisywać bloki typu entitywidget, entity_label w zależności pod jaką nazwą w środku to określiłeś w samej klasie.

Możesz skorzystać
  • Odpowiedz
@jreekkas: ten sam problem właśnie miałem - niby fajnie, bo możesz sobie potem używać takiego bundle'a w innym projekcie, ale w praktyce i tak nigdy nie użyłem, a poziom chaosu który się robił przez zwiększoną ilość bundli rósł wykładniczo.

Jak coś mam używać w ramach wspólnych to i tak leci do vendors.
  • Odpowiedz
#php #symfony #symfony3 proszę o #codereview mojej próby stworzenia projektu w oparciu o Hexagonal Architecture i jednocześnie zrozumienia tej koncepcji. W przypadku encji poszedłem na skróty, ale z tego co oglądałem na konferencjach, to zdarzają się takie decyzje, które ułatwiają pracę (np Kris Wallsmith). Moja encja jest jednocześnie tą z domeny oraz z bazy danych. Jeśli z kodu wynika Wam, że czegoś nie rozumiem
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@masterix: nie nazwałbym tego co robisz architekturą heksagonalną. Brak wstrzykiwania zależności by móc nimi żonglować (a nam tym polega ta architektura, wyciągasz bloczek "wolny MySQL" i wkładasz za niego "szybki Elasticsearch"), beznadziejnie zaimplementowany CQRS (to nawet nie jest CQRS bo nie ma literki Q, nie ma literki C, pewnie nie ma również R i S, chyba, że zmienna $commandBus jest tylko z nazwy), brak separacji zmiennych (modyfikator publiczny, kiedy można dać konstruktor, getter i rozbić na walidację domenową), straszna integracja z samym Symfony.

Architektura heksagonalna polega na rozbiciu zależności i łączenie się "mostkami", tj. mam bazę MySQL, wymieniam na PostgreSQL i implementacja działa, do tego wymieniam wyłącznie warstwę aplikacji (tj. repozytoria). Chcę by moja aplikacja nie działała jako strona-widok tylko konsola-plik json, to tworzę komendę, i w niej wiem, że potrzebuję taką, taką i taką zależność a reszta kroków jest w 99% identyczna do webu.

Co do aplikacji (Symfony):
* nie nazywaj serwisów app.synchronous_command_bus tylko AppBundle\Application\CommandBus\SynchronousCommandBus, od 3.3 takie
  • Odpowiedz
Mirki jest taka sprawa, potrzebuję do zamówień w kinie w podsumowaniu wybranych miejsc wyświetlić w każdym wierszu odpowiadającym wybranemu miejscu - listę rozwijaną z wyborem ceny biletu dla danego miejsca (ulgowy, zwykły). Ale cholera kiedy robię pętlę wyświetlającą wybrane miejsca i próbuję wyświetlić listę, to pokazuje się ona tylko jeszcze raz. Jak to zrobić, aby wyświetliła się dla każdego? I w ogóle jak to później zbindować do każdego pojedynczego obiektu Ticket?

#
  • 1
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@qwelukasz: jak zainstalujesz z composera z parametrem --prefer-source to mozesz sobie w katalogu w vendor/bundle zmieniac co chcesz i komitowac, ale osobiscie proponuje i stosuje inne podejscie. Oczywiscie zakladam, ze piszesz testy. Zrob katalog Tests/app, w ktorym zainstalujesz AppKernel i symfony, w ktore wepniesz swoj bundle. Mozesz wtedy odpalic tak stworzona appke w browserze, testowac funkcjonalnie i tak dalej. Pracuje wciaz nad tym, ale tu przyklad mojego kodu:

https://github.com/UirapuruDende/CalendarBundle/tree/master/Tests/app
  • Odpowiedz