Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony][Symfony2][Symfony3]Jak wywołać funkcje __clone() w Symfony 3?
wluczykuj
post
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 13.12.2016

Ostrzeżenie: (0%)
-----


Cześć, mam takie pytanie :

Potrzebuje sklonować/skopiować rekord w bazie danych za pomocą np. przycisku w aplikacji . W danym kontrolerze zrobiłem funckje private function cloneAction(Grid $grid) , tylko z racji, że nie jestem w tym biegły nie wiem jak wywołać ją na stronie żeby po przyciśnięciu przycisku dany rekord mi się skopiował. Zależy mi aby przycisk [kopiuj] pojawił się na wygenerowanej stronie np show.html.twig . Czy mógłby ktoś mi w tym pomóc, doradzić ? To kod jaki mam, czy w ogole on jest w porzadku ?

EDIT: nalezy użyć metody __clone()? jesli tak to w jaki sposob ?

  1. private function cloneAction(Grid $grid){
  2. $oldGrid= ($grid);
  3. $newGrid= clone $oldGrid;
  4.  
  5. return $this->render('grid/show.html.twig', array(
  6. 'newGrid' => $newGrid
  7.  
  8. ));
  9. }


Ten post edytował wluczykuj 13.12.2016, 20:52:32
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


1. Nie trzeba klonować. Poza tym to jest słabe, bo nie klonuje ani dzieci, ani tym bardziej relacji, czyli jak masz obiekt A a pod nim B i C gdzie B ma relację do C, to sklonowany obiekt A2 nie będzie zawierał B2 i C2, tylko B i C. Do tego problemy z wydajnością (obiekty bazy danych są zazwyczaj dość rozległe) czy stabilnością (jeden rekord w bazie to powinien być jeden obiekt).
2. Kopiując encję musimy mieć na uwadze dwie rzeczy:
- które obiekty chcemy powielić a które nie
- które relacje chcemy podmienić a które nie

Przykład: obiekt A składa się z B i C, przy czym B ma relację do C. Zalożenia:
- powielamy A, B i C na A2, B2 i C2
- relacja w B2 wciąż wskazuje na C, więc zmieniamy to relację na C2
Czyli będą dwa etapy:
1. Powielanie wybranych obiektów
2. Zmiana relacji w wybranych obiektach

Etap pierwszy możemy zautomatyzować korzystając z kaskadowości:
http://docs.doctrine-project.org/projects/...sociations.html

Czyli jak mamy np. Menu gdzie będzie relacja do Url a w "cscade" ustawimy "detach" to:
  1. $entityManager->detach($menu);

Spowoduje, że zarówno Menu, jak i Url będą jakby "odłączone" od bazy, nie są one już obiektowymi odpowiednikami rekordów w bazie lecz "zwykłymi" obiektami i próba ich np. flushowania zwróci exception.
Można natomiast:
  1. $entityManager->persist($menu);

I teraz znów, możemy ustawić kaskadowość tak, żeby Url został dodany od razu z Menu

Natomiast etap drugi musimy zrobić ręcznie, czyli dotrzeć do odpowiednich obiektów i wywołać odpowiednie settery.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 10:59