Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 896 Pomógł: 76 Dołączył: 15.11.2003 Skąd: Sosnowiec/Kraków Ostrzeżenie: (0%)
|
Właśnie po raz pierwszy zaimplementowałem upload obrazka + Doctrine i mam pewne wątpliwości. Chodzi o nakład pracy w kodzie potrzebny do przeprowadzenia tej operacji. Zrobiłem to w oparciu o lifecycle callbacks i musiały powstać 3 pola i 11 metod w obiekcie. Fajnie, że nie trzeba nic robić w kontrolerze i rozumiem, że część tych metod to rzeczy w stylu getWebPath i jak mi się nie podoba to nie muszę koniecznie ich używać, ale mimo wszystko to wydaje mi się trochę dziwne. Strach pomyśleć co się stanie jak będę miał 6 plików przy obiekcie.
A na koniec jeszcze czytam w cookbook, że "The PreUpdate and PostUpdate callbacks are only triggered if there is a change in one of the entity's field that are persisted" więc jak zmienię tylko awatar w profilu usera to on mi się nie zapisze :/ Trochę to załamujące, czy to podejście z cookbook jest naprawdę optymalne? Ten post edytował Foxx 17.04.2013, 13:48:09 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%)
|
Przykłady uploadu w dokumentacji formularzu Symfony są fatalne - gwałcą kilka podstawowych zasad "dobrego kodu", które sam framework mocno forsuje. Nigdy nie powinny się tam znaleźć w takiej formie.
1. Utwórz odpowiedni model: 1.1. Obiekt reprezentujący wgrywany plik: 1.2. W obiekcie, który posiada ów obraz (powiedzmy, że rozważamy klasyczny przykład użytkownika i jego awataru) najczęściej chcemy przechować jedynie ścieżkę do pliku. Ewentualnie możemy mieć kompletnie osobną tabelę w bazie danych reprezentującą obraz oraz metadane jego dotyczące (wymiary, typ itp.) złączony z inną tabelą relacją jeden-do-jednego. W obu przypadkach mechanizm jest jednak taki sam, więc omówimy jedynie ten pierwszy: Obiekt domeny nie powinien mieć absolutnie nic wspólnego z uploadem plików! 1.3. Na koniec potrzebujemy osobny obiekt, który złączy to wszystko razem, tj. wgrywany plik oraz interesujący nas obiekt sam w sobie: $object to obiekt do którego będziemy wgrywać zdjęcie, $image to samo zdjęcie, a $imagePath to ścieżka do właściwości przechowującej ścieżkę do wgrywanego pliku (patrz: komponent PropertyAccess Symfony). Czyli w tym przypadku ścieżką taką będzie "object.avatarPath" (właściwie to pierwszy człon "object." można pominąć). Jeżeli nasz obiekt byłby bardziej złożony i tak możemy bez problemu określić ścieżkę do właściwości "...path", np.: "object.image.path", "object.profile.defaultImage" itp. 1.4. Zarówno obiekt Image jak i ImageUpload mogą być wykorzystywane z dowolnym innym obiektem (User, Profile, Photo, Album itp.) 2. Model jest już przygotowany, pozostało obsłużenie samego uploadu. Właściwie to samym uploadem zajmje się symfony, my musimy jedynie zadbać o to by z wgranego pliku ("image.image") ścieżka została przepisana do interesującej nas właściwości obiektu domeny (tutaj: "object.avatarPath"). To zadanie musi wykonać się po walidacji formularza i przed pobraniem z niego danych w celu dalszej obróbki: FormEvents::POST_BIND. 2.1. Tworzymy sobie usługę, którą rejestrujemy jako listenera dla w/w zdarzenia. Ta usługa, bez problemu może w swoim konstruktorze otrzymać ścieżkę do katalogu dla uploadu czy jakąś usługę typu FilesystemUtility, która wygeneruje unikalną nazwę dla pliku. Mając już takiego listnera możemy spokojnie przerzucić dane:
3. Obsługa tego w jakimś kontrolerze:
Plusy takiego rozwiązania: 1. Jest uniwersalne, można je wykorzystać z dowolnym obiektem. 2. Wszystko jest ładnie rozdzielone, mamy czysty kod. Jeżeli chciałbyś dodać obsługę wielu plików, wystarczy że zmodyfikujesz powyższe w taki sposób by ImageUpload posiadał kolekcję obiektów Image oraz tablicę $imagePath. Ten post edytował Crozin 17.04.2013, 16:17:23 |
|
|
|
Foxx [Symfony2][Symfony] file upload nie podoba mi się 17.04.2013, 13:28:57
Foxx O rany, Crozin, dzięki. Tamto rozwiązanie z cookbo... 17.04.2013, 16:29:06
q3trm Cytat(Crozin @ 17.04.2013, 17:14:01 )... 14.10.2013, 22:13:42
Crea17 Witam.
Próbuję zrobić uploader wg tego co napisał... 19.02.2014, 23:27:56
Crozin Metoda PropertyAccessor::setValue oczekuje zawsze ... 23.02.2014, 11:50:05
Crea17 Ok, tylko w tym momencie dostaje error: Ta wartość... 24.02.2014, 21:33:45
pyro Niezłe farmazony. Zapomnij o tych absolutnie zbędn... 24.02.2014, 22:09:37
Crea17 @pyro
Czyli praktycznie tak jak jest napisane w C... 24.02.2014, 22:48:28
pyro Nie. Zgadzam się z @Crozin, że podane tam przykład... 24.02.2014, 23:52:47
Crea17 Czyli w encji:
[PHP] pobierz, plaintext /** ... 25.02.2014, 09:52:27
pyro Coś w ten deseń, tak.
// EDIT
Cytat(Crea17 ... 25.02.2014, 09:57:07
Crea17 Ok. Dziękuję bardzo za pomoc 25.02.2014, 10:04:06
Crozin @Crea17: Umknął mi gdzieś ten wątek.
Powinieneś m... 28.02.2014, 17:24:39 ![]() ![]() |
|
Aktualny czas: 29.12.2025 - 20:10 |