Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][Symfony]Używanie własnych klas w Entity
Forum PHP.pl > Forum > PHP > Frameworki
athabus
Dalej uczę się korzystać z Symfony i chciałby zrobić pewne rzeczy "ładnie". Na dzisiaj mam Zestaw swoich klas, które często używam w różnych projektach. Pomyślałem, żeby zrobić sobie z nich bundla Dajmy na to AcmeUtilBundle.

Mam w nim klasę Converter i metodę statyczną slugify.


Ok i co dalej? Rozumiem, że mogę sobie zdeklarować Service i używać wszystkiego w kontrolerze np.
  1. $this->get('Converter')->slugify($name);


Jak jednak użyć ładnie tych metod w Entity, żeby np. podczas ustawiania pola name od razu generować slug?

A może w ogóle źle zabieram się do tego problemu?
matix
Cześć,

Tak i nie.
Generalnie do generowania sluga (zakładam, że mówisz o encjach, czyli korzystasz z Doctrine2) używa się DoctrineExtensionBundle i zachowania Sluggable. Masz jeszcze NestedSet (do generowania drzewa) i kilka innych, bardzo fajnych zachowań.

Domyślam się, że masz nie tylko klasę do do generowania slugów, więc najbardziej Symfony2 way:
1) Jeżeli chcesz wykonać jakieś operacji na encji - robisz metodę w encji, ALE TYLKO WTEDY GDY NIE POTRZEBUJESZ INNYCH ZEW. KLAS,
2) Jeżeli chcesz wykonać jakąś operację na encji, lecz potrzebujesz innej klasy do tego wtedy kod ten powinien być zadeklarowany jako usługa, manager.

Example dla punktu 1
Masz koszyk (encja Cart) oraz produkty do niego dodane (CartItem). Chcesz policzyć sumaryczny koszt wszystkich produktów w koszyku. Tworzysz w encji Cart metodę getTotalNetPrice() [na przyklad] i tam robisz petle po wszysktich CartItem (oczywiscie joinujemy wtedy CartItem ;-) i dodajesz kwoty * quantity, zwracasz.
Najważniejsze jest to, że nie potrzeba Ci tutaj żadnej zewnętrznej biblioteki.

Example dla punktu 2
Chcesz np. podświetlić kod PHP w ramach jakiegoś artykułu. Potrzebujesz do tego: np. encji Page oraz klasy obsługującej podświetlanie składki, parsującej content. W tym momencie potrzebujesz usługi/managera (ja wolę określenie Manager) - PageManager.
Deklarujesz go jako usługe pod aliasem np. "page.manager".

W tym momencie w kontrolerze w którym wyświetlasz / lub lepiej - edytujesz content masz cos takiego:
  1. public function updateAction(Request $request, Page $page)
  2. {
  3. $this->get('page.manager')->parsePage($page);
  4. $this->getDoctrine()->getManager()->flush($page);
  5.  
  6. // ...
  7. }


Czyli wyciagasz logikę poza encję, po czym flush następuje z poziomu controllera / lub np. eventu, ale o tym już nie będę się rozpisywał więcej.

Nie wiem czy dostatecznie wyjaśniłem o co chodzi.

Pozdrawiam,
M.
ziolo
Dokładnie robi się tak jak napisał Matix. Wewnątrz encji nie używa się żadnych usług.
Ja też używam DoctrineExtensionBundle. Ale slug jest dość standardowy a dla innych mniej standardowych rzeczy robi się to po przez:

http://symfony.com/doc/current/cookbook/do...ubscribers.html

Czyli tworzysz subscriber lub listenera Doctrine. Rejestrujesz go jako usługę.
Np listenera PrePersist - do tego listenera wstrzykujesz swoją usługę Converter.
Sprawdzasz w PrePersist typ obiektu, jeśli typ pasuje, to wtedy ustawiasz mu sluga lub cokolwiek innego przy pomocy twojej usługi Converter.

  1. $this->get('Converter')->slugify($name);

PS: Oczywiście metoda slugify nie jest statyczna i nie powinna być statyczna smile.gif
skowron-line
http://symfony.com/doc/current/cookbook/do...ubscribers.html
+
http://symfony.com/doc/current/cookbook/se...t_listener.html

i wy tych klasach mozesz sobie robic wszystko.
destroyerr
Ja zacznę od tego, że swoich klas wcale nie musisz wrzucać do bundla. Mogą sobie pozostać poza nim. Dodatkowo, jeżeli Ci to wystarcza, to możesz dalej korzystać z metody statycznej lub zwykłej funkcji. W opozycji do pomysłu ze zdarzeniami, jeżeli nie lubisz żeby model był związany z frameworkiem to proponuję następujące rozwiązanie:
  1. use Ddd\Slug\Model\SluggableInterface;
  2. use Ddd\Slug\Service\SlugGeneratorInterface;
  3.  
  4. class Article implements SluggableInterface
  5. {
  6. private $createdAt;
  7. private $title;
  8. private $slug;
  9.  
  10. public function slugify(SlugGeneratorInterface $slugifier)
  11. {
  12. $this->slug = $slugifier->slugify(array($this->createdAt->format('Y'), $this->title));
  13. }
  14.  
  15. // other methods...
  16. }

  1. use Ddd\Slug\Infra\SlugGenerator\DefaultSlugGenerator;
  2. use Ddd\Slug\Infra\Transliterator\LatinTransliterator;
  3.  
  4. $article = new Article();
  5. $article->setTitle('Hello world!');
  6. $article->slugify(new DefaultSlugGenerator(array(new LatinTransliterator())));
  7.  
  8. echo $article->getSlug(); // writes "2013-hello-world"


Co do korzystania z menedżerów to nie polecam. Prowadzi to często do obiektów które wykonują wiele zadań.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.