Symfony wstrzykiwanie zależności.

Symfony wstrzykiwanie zależności.
Wave21
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:34
0

Cześć mam mały problemik.
Czytam sobie dokumentację symfony i wszytstko fajnie aż dochodzę do pewnego momentu gdzie nie mam pojęcia co z tym zrobić.
Strona z dokumentacją : http://symfony.com/doc/current/controller/upload_file.html
Mam następujący kod.

Kopiuj
public function newAction(Request $request, FileUploader $fileUploader)

Czy może mi ktoś powiedzieć jak wstrzyknąć FileUploadera do akcji?
Próbowałem zarejestrować kontroler jako serwis w następujący sposób:

Kopiuj
services:
    wave_dev_invoice_reader.upload_file:
        class: WaveDev\InvoiceReaderBundle\Service\FileUploader
        arguments: ["%invoices_directory%"]

    wave_dev_invoice_reader.default_controller:
        class: WaveDev\InvoiceReaderBundle\Controller\DefaultController
        arguments: ['@wave_dev_invoice_reader.upload_file']

route:

Kopiuj
wdir_process_image:
    path:   /process-image
    defaults: { _controller: wave_dev_invoice_reader.default_controller } # czy też z wywoaniem konkretnej akcji

Kontroler zostaje wywołany, ale nie zostaje do niego wstrzyknięty żaden obiekt.

Wave21
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:34
0

Małe sprostowanko. Z rejestrowaniem kontrolera jako serwis dobrze kombinowałem (jednak działa, rombnołem się troszkę). Ale tracę przy tym $container i nie mogę korzystać z metody get().

no_solution_found
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 12 godzin
0

bo Ci ta metoda nie jest potrzebna. W robieniu kontrolerów jako serwisy chodzi o to, by nie przekazywać tam całego kontenera :)

zrób konstruktor, w którym zdefiniujesz zależności i podczas rejestrowania go wstrzyknij tam zależności. Nie będziesz wtedy potrzebować metody $this->get() w kontrolerze.


Wave21
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:34
0

Czaję, a przy okazji. Czytałem dokumentację do nie właściwej wersji sf. I nie mogłem garnąć w jaki sposób jest wrzucany dodatkowy argument do akcji :D. I kombinowałem troszkę jak koń od górę.
Zdarzyło ci się kiedyś zmieniać kontrolery na serwisy? W jakich sytuacjach to robiłeś?

no_solution_found
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 12 godzin
1

to zależy od sytuacji. Przykład: masz eksport listy zamówień/produktów/postów do kilku formatów xml/csv/coś_tam_jeszcze. Rejestrujesz serwis-kontroler, który ma tylko jedną metodę exportAction(). Tworzysz interfejs dla wszystkich tych typów eksportu i następnie 3 klasy, które będą te eksporty wykonywać.
Następnie, rejestrujesz 3 routingi do tych eksportów, ale dla każdego z nich do kontrolera wstrzykujesz inną zależność (tzn. klasę, która odpowiada za eksport). Dzięki temu w kontroler jest maksymalnie pusty (konstruktor, jedna zmienna z klasą do eksportu xml,csv etc oraz akcję exportAction()). Kolejne typy eksportu to implementacja ww interfejsu i podpięcie do tego routingu.

Podsumowując: ExportInterface,
XMLExport implements ExportInterface
CSVExport implements ExportInterface
// ...

następnie tworzysz ExportController, który w konstruktorze ma zależność do ExportInterface. Rejestrujesz tyle serwisów z ExportController ile masz formatów eksportu (każdy ma w sobie inną implementację ExportInterface
Kolejno, dla każdego eksportu robisz coś na wzór tego: http://symfony.com/doc/current/controller/service.html


no_solution_found
może trochę chaotycznie to napisałem, ale mam nadzieję, że w miarę zrozumiale
PA
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 6 lat
  • Postów:339
0

@no_solution_found: Ja zrozumiałem,ale tak szczerze, równie dobrze można zrobić 3 akcje w kontrolerze i mieć to samo. Nie masz interfejsów, dodatkowych klas itd. Zgodność z zasadami w miarę zachowana bo kontroler tylko wykonuje metody exportu a nie robi czegoś innego. Więc jaka jest zaleta tworzenia serwisu?

no_solution_found
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 12 godzin
0

powtarzasz kod w kontrolerze. W takim wypadku jak wygląda np testy? W kontrolerze testujesz 1 metodę. Masz do tego 3 mniejsze klasy, które potestujesz jednostkowo. Wyobraź sobie, że dla każdego eksportu robisz akcję w kontrolerze. Jest ich 10. Dla każdego eksportu do kontrolera wstrzykujesz zależności. Widzisz już z czym zacznie się robić problem? By wyeksportować do csv wstrzykujesz niepotrzebnie wszystkie inne zależności, budowane są serwisy, które zupełnie nie są potrzebne itp.

Jak pisałem wcześniej, to wszystko zależy do potrzeb i problemów :)


PA
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 6 lat
  • Postów:339
0

Chodzi ci o to, że tworząc 10 akcji kontrolera (eskportów) a przy tym zamiast stworzyć serwis rozszerzam bazowy kontroler, wstrzykuję wszystkie zależności? (no bo je przetrzymuje kontroler bazowy, typu managera doctrine, renderowanie widoków itd)

Po prostu jako tako na razie nie widzę w ogóle zalet w używaniu serwisów. Być może to za małe doświadczenie w symfony.

no_solution_found
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 12 godzin
0

możliwe, albo brakuje dobrego przykładu. Szukałem na oficjalnym blogu symfony dobrego przykładu tego podejścia, ale oni to tam opisali bardzo ogólnie i minimalistycznie.
Dzieląc jedną klasę na mniejsze ułatwiasz sobie późniejsze utrzymywanie oraz testowanie, bo masz do przetestowania 10 małych klas a nie jedną wielką z dziesiątkami zależności. Albo do parametrów funkcji dopisuje się kolejne argumenty co powoduje, że zaczynają robić się potwory
Myślę, że bardzo dobrym antypaternem jest ta klasa https://github.com/Setasign/FPDF/blob/master/fpdf.php


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)