Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony]SF2 return json...
Szymciosek
post
Post #1





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Witam,
chciałem zobaczyć jak Symfony2 poradzi sobie jako API i w tym celu chciałem wykorzystać ActionScript3.0 + Symfony2 (PHP) więc mam sobie jakąś aplikację, która wysyła z flasha json ( { id:1 } )
więc flash oczekuje wszystkich kolumn, które należą do ID = 1. Jako z tym nie mam problemu, bo normalnie mogę zrobić to tak:

  1. $json = json_decode($_POST['data']); //odebranie json z flash
  2.  
  3. $query = mysql_query("SELECT * FROM user WHERE id=$json->id"); //zapytanie do bazy
  4.  
  5. while($data = mysql_fetch_object($query))
  6. {
  7. $object = array(
  8. 'user' => $data,
  9. );
  10. } //uzupełnienie tablicy $object danymi z bazy
  11. print json_encode($object); //zwrócenie json do flasha


ale jak to samo zrobić w Symfony2 ?

  1. <?php
  2.  
  3. namespace SimonMedia\ApiBundle\Controller;
  4.  
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  8.  
  9. class DefaultController extends Controller
  10. {
  11. /**
  12.   * @Route("/")
  13.   * @Template()
  14.   */
  15. public function indexAction()
  16. {
  17. return array();
  18. }
  19.  
  20. /**
  21.   * @Route("/user/get/all")
  22.   */
  23. public function getAll()
  24. {
  25. $em = $this->getDoctrine()->getEntityManager();
  26. $entities = $em->getRepository('SimonMediaApiBundle:Userzy')->findAll();
  27.  
  28. var_dump($entities);
  29. }
  30. }


var_dump zwraca
  1. array (size=3)
  2. 0 =>
  3. object(SimonMedia\ApiBundle\Entity\Userzy)[211]
  4. private 'id' => int 1
  5. private 'name' => string 'Janusz' (length=6)
  6. private 'email' => string 'Janko@wp.pl' (length=11)
  7. private 'phone' => string '668559634' (length=9)
  8. 1 =>
  9. object(SimonMedia\ApiBundle\Entity\Userzy)[206]
  10. private 'id' => int 2
  11. private 'name' => string 'Marek' (length=5)
  12. private 'email' => string 'Maro@wp.pl' (length=10)
  13. private 'phone' => string '665583999' (length=9)
  14. 2 =>
  15. object(SimonMedia\ApiBundle\Entity\Userzy)[207]
  16. private 'id' => int 3
  17. private 'name' => string 'Mariusz' (length=7)
  18. private 'email' => string 'Mario@wp.pl' (length=11)
  19. private 'phone' => string '994888777' (length=9)


Ale nijak nie potrafię się po tym ruszyć...

EDIT::
Doszedłem do tego, że po zmianie w klasie Userzy.php (entity) z private na public mam dostęp do np

print $entities[0]->name;

w przeciwnym razie otrzymuję error
Cannot access private property SimonMedia\ApiBundle\Entity\Userzy::$name in F:\WORK\labs\Symfony\ApiID\src\SimonMedia\ApiBundle\Controller\DefaultController.php on line 28

Ale chyba taka zmiana nie jest dobra i nie na tym to ma polegać ?

Ten post edytował Szymciosek 16.09.2012, 11:06:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
m44
post
Post #2





Grupa: Zarejestrowani
Postów: 63
Pomógł: 10
Dołączył: 16.11.2008

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


Tworzysz sobie w repozytorium "Userzy" metodę, która zwraca kolekcję użytkowników jako tablicę.
W kontrolerze przekazujesz zmienną do widoku. Jeśli chcesz używać adnotacji @Template nie zapomnij, żeby w szablonie przekonwertować tą zmienną do json.
Możesz też od razu w repozytorium potraktować zwróconą kolekcję json_encode, jak zrobisz zależy od Twojej organizacji kodu.

Inna ważna sprawa, to odpowiedni nagłówek w odpowiedzi zwrotnej. Możesz w routingu zdefiniować domyślny parametr, który nazywa się "_format" i wtedy Symfony automatycznie wyśle odpowiedni nagłówek.
Możesz też ustawić nagłówek bezpośrednio w kontrolerze manipulując obiektem Response. Nie zapominaj, że kontroler w Symfony powinien zwrócić obiekt Response, a to czy go zwracasz pomagając sobie adnotacjami, czy przez metody pomocnicze kontrolera to sprawa drugorzędna.

Nie rozumiem, dlaczego próbujesz dostać się do właściwości obiektu nie używając metod dostępowych. Przecież operujesz na obiektach, wiec po to masz w klasie Entity metody dostępowe (get* i set*), żeby ich używać, a nie bezpośrednio używać prywatnych czy chronionych właściwości.
Go to the top of the page
+Quote Post

Posty w temacie
- Szymciosek   [Symfony]SF2 return json...   16.09.2012, 10:43:09
- - marcio   Pokaz klase entity, powinienes w niej miec gettery...   16.09.2012, 12:17:30
- - Szymciosek   Owszem mam. [PHP] pobierz, plaintext Owszem mam....   16.09.2012, 12:48:12
- - marcio   Nie rozumiem. Robisz petle na obiekcie i potem wy...   16.09.2012, 12:54:51
- - Szymciosek   Czyli jak ? Mam problem nawet z dostaniem się do p...   16.09.2012, 13:00:11
- - m44   Tworzysz sobie w repozytorium "Userzy" m...   16.09.2012, 13:09:17
- - Szymciosek   Możesz powiedzieć coś więcej o tej metodzie ? Pot...   16.09.2012, 13:56:39
- - phpion   Podstawy budowy tablic się kłaniają... [PHP] pobie...   16.09.2012, 14:09:35
- - Szymciosek   Z takim problemem sobie poradziłem i działa ok dzi...   19.09.2012, 19:43:18
- - marcio   Tak na szybko: [PHP] pobierz, plaintext foreach ...   20.09.2012, 07:12:38
- - phpion   Może warto najpierw zapoznać się z podstawami PHP,...   20.09.2012, 08:20:50
- - Szymciosek   Niestety, próbowałem już chyba na wszystkie sposob...   20.09.2012, 16:41:54
- - phpion   Spróbuj tego: [PHP] pobierz, plaintext $data = arr...   20.09.2012, 18:02:57
- - Szymciosek   Działa bardzo dobrze, ale chyba nie wpadłbym na to...   20.09.2012, 18:14:11
- - netrat   Osobiście sugerowałbym wpierw zbudowanie odpowiedn...   1.10.2012, 20:58:23
- - Szymciosek   No a jak wtedy wygląda metoda toArray ?   1.10.2012, 21:07:50
- - ano   Zamiast ręcznie transformować obiekty na tablice, ...   7.10.2012, 13:09:12
- - Szymciosek   Witam ponownie, nie chciałem zakładać nowego temat...   13.10.2012, 12:17:46
- - m44   To wszystko jest opisane w dokumentacji Doctrine. ...   13.10.2012, 19:24:34
- - Szymciosek   Właśnie chodzi o to czy kolumna istnieje w bazie, ...   14.10.2012, 00:47:05


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: 3.10.2025 - 20:09