1

My question is simple I want to return an array for an api rest in json (with JsonResponse) :

I give you an exemple of what I started to do :

My json response :

{
 "success": "true",
 "message": "Liste du Profil",
 "id": 54,
 "username": "TestTest7",
 "phone": null,
 "email": "[email protected]",
 "resume": "TestTest7",
 "language": null,
 "friends_added": [
 {
 "id_friend": {}
 }
 ],
 "friends_accepted": [],
 "friends_added_need_to_be_accept": [
 {
 "id_friend": {}
 }
 ],
 "friends_need_to_be_accept": []
}

As you can see, that's not what I want because the fields are empty : id_friend as content in database friends_added_need_to_be_accept too but the 2 others have empty database.

My controller :

/**
 *
 * @Rest\Post(
 * path = "/profile/list",
 * name = "api_profile_list"
 * )
 * @Rest\View(StatusCode=201, serializerGroups={"user_detail"})
 */
public function ProfileListAction(Request $request)
{
 $em = $this->getDoctrine()->getManager();
 $user = $em->getRepository('AppBundle:User')->findOneBy(array('id' => ($request->get('id_user'))));
 $token = $request->get('token');
 if (!isset($user)) {
 return new JsonResponse([
 'success' => "false",
 'message' => "Utilisateur non renseigné"
 ]);
 }
 if (!isset($token)) {
 return new JsonResponse([
 'success' => "false",
 'message' => "Token non renseigné"
 ]);
 }
 if ($user->getToken() != $token) {
 return new JsonResponse([
 'success' => "false",
 'message' => "Mauvais token",
 ]);
 }
 $profile = $user->getIdProfile();
 $profile = $em->getRepository('AppBundle:Profile')->findOneBy(array('id' => ($profile)));
 $friend_3 = $em->getRepository('AppBundle:Friend')->findBy(array(
 'user_one' => ($user->getId()),
 'enabled' => 1
 ));
 $friend_4 = $em->getRepository('AppBundle:Friend')->findBy(array(
 'user_two' => ($user->getId()),
 'enabled' => 1
 ));
 $friend_1 = $em->getRepository('AppBundle:Friend')->findBy(array(
 'user_one' => ($user->getId()),
 'enabled' => 2
 ));
 $friend_2 = $em->getRepository('AppBundle:Friend')->findBy(array(
 'user_two' => ($user->getid()),
 'enabled' => 2
 ));
 if (!isset($friend_1) and !isset($friend_2)) {
 return new JsonResponse([
 'success' => "true",
 'message' => "Liste du Profil",
 'id' => $user->getId(),
 'username' => $user->getUsername(),
 'phone' => $profile->getPhone(),
 'email' => $profile->getEmail(),
 'resume' => $profile->getResume(),
 'language' => $profile->getLanguage(),
 ]);
 }
 $arrayCollection_1 = array();
 $arrayCollection_2 = array();
 $arrayCollection_3 = array();
 $arrayCollection_4 = array();
 foreach($friend_1 as $friends_1) {
 $arrayCollection_1[] = array(
 'id_friend' => $friends_1->getUserOne(),
 );
 }
 foreach($friend_2 as $friends_2) {
 $arrayCollection_2[] = array(
 'id_friend' => $friends_2->getUserOne(),
 );
 }
 foreach($friend_3 as $friends_3) {
 $arrayCollection_3[] = array(
 'id_friend' => $friends_3->getUserOne(),
 );
 }
 foreach($friend_4 as $friends_4) {
 $arrayCollection_4[] = array(
 'id_friend' => $friends_4->getUserOne(),
 );
 }
 return new JsonResponse([
 'success' => "true",
 'message' => "Liste du Profil",
 'id' => $user->getId(),
 'username' => $user->getUsername(),
 'phone' => $profile->getPhone(),
 'email' => $profile->getEmail(),
 'resume' => $profile->getResume(),
 'language' => $profile->getLanguage(),
 'friends_added' => $arrayCollection_1,
 'friends_accepted' => $arrayCollection_2,
 'friends_added_need_to_be_accept' => $arrayCollection_3,
 'friends_need_to_be_accept' => $arrayCollection_4,
 ]);
}

My profile entity :

class Profile
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 * @ORM\OneToOne(targetEntity="User", inversedBy="Profile")
 */
protected $id;
/**
 * @var string
 *
 * @ORM\Column(name="resume", type="text", length=65535, nullable=true)
 */
protected $resume;
/**
 * @var string
 *
 * @Assert\Image()
 * @ORM\Column(name="avatar_path", type="string", length=255, nullable=true)
 */
protected $avatarPath;
/**
 * @var \DateTime
 *
 * @ORM\Column(name="last_connexion", type="datetime", nullable=false)
 */
protected $lastConnexion;
/**
 * @var \DateTime
 *
 * @ORM\Column(name="birth", type="datetime", nullable=false)
 */
protected $birth;
/**
 * @var string
 *
 * @ORM\Column(name="email", type="string", length=255, nullable=false, unique=true)
 */
protected $email;
/**
 * @var integer
 *
 * @ORM\Column(name="level", type="integer", nullable=false)
 */
protected $level = '1';
/**
 * @var string
 *
 * @ORM\Column(name="phone", type="string", length=60, nullable=true, unique=true)
 * @Assert\Regex(
 * pattern="/(0|\+)[1-9]([-. ]?[0-9]{2}){4}/",
 * message="You need to put a french number ! Starting with 0 or +33 !",
 * )
 */
protected $phone;
/**
 * @var string
 *
 * @ORM\Column(name="language", type="text", length=65535, nullable=true)
 */
protected $language;
/**
 * @var boolean
 *
 * @ORM\Column(name="is_male", type="boolean", nullable=false)
 */
protected $isMale = '1';
/**
 * @var \DateTime
 *
 * @ORM\Column(name="created_account", type="datetime", nullable=false)
 */
protected $createdAccount = 'CURRENT_TIMESTAMP';
/**
 * @return int
 */
public function getId()
{
 return $this->id;
}
/**
 * @param int $id
 */
public function setId($id)
{
 $this->id = $id;
}
/**
 * @return string
 */
public function getResume()
{
 return $this->resume;
}
/**
 * @param string $resume
 */
public function setResume($resume)
{
 $this->resume = $resume;
}
/**
 * @return string
 */
public function getAvatarPath()
{
 return $this->avatarPath;
}
/**
 * @param string|null
 */
public function setAvatarPath($avatarPath)
{
 $this->avatarPath = $avatarPath;
}
/**
 * @return \DateTime
 */
public function getLastConnexion()
{
 return $this->lastConnexion;
}
/**
 * @param \DateTime $lastConnexion
 */
public function setLastConnexion(\DateTime $lastConnexion)
{
 $this->lastConnexion = $lastConnexion;
}
/**
 * @return \DateTime
 */
public function getBirth()
{
 return $this->birth;
}
/**
 * @param \DateTime $birth
 */
public function setBirth(\DateTime $birth)
{
 $this->birth = $birth;
}
/**
 * @return string
 */
public function getEmail()
{
 return $this->email;
}
/**
 * @param string $email
 */
public function setEmail($email)
{
 $this->email = $email;
}
/**
 * @return int
 */
public function getLevel()
{
 return $this->level;
}
/**
 * @param int $level
 */
public function setLevel($level)
{
 $this->level = $level;
}
/**
 * @return string
 */
public function getPhone()
{
 return $this->phone;
}
/**
 * @param string|null
 */
public function setPhone($phone)
{
 $this->phone = $phone;
}
/**
 * @return string
 */
public function getLanguage()
{
 return $this->language;
}
/**
 * @param string $language
 */
public function setLanguage($language)
{
 $this->language = $language;
}
/**
 * @return \DateTime
 */
public function getCreatedAccount()
{
 return $this->createdAccount;
}
/**
 * @param \DateTime $createdAccount
 */
public function setCreatedAccount(\DateTime $createdAccount)
{
 $this->createdAccount = $createdAccount;
}
/**
 * @return bool
 */
public function isMale()
{
 return $this->isMale;
}
/**
 * @param bool $isMale
 */
public function setIsMale($isMale)
{
 $this->isMale = $isMale;
}
}

and my friend entity :

class Friend
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $id;
/**
 * @var \AppBundle\Entity\User
 *
 * @ORM\GeneratedValue(strategy="NONE")
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumns({
 * @ORM\JoinColumn(name="user_id_one", referencedColumnName="id")
 * })
 */
protected $user_one;
/**
 * @var \AppBundle\Entity\User
 *
 * @ORM\GeneratedValue(strategy="NONE")
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumns({
 * @ORM\JoinColumn(name="user_id_two", referencedColumnName="id")
 * })
 */
protected $user_two;
/**
 * @var integer
 *
 * @ORM\Column(name="enabled", type="integer", nullable=false)
 */
private $enabled;
/**
 * @return int
 */
public function getEnabled()
{
 return $this->enabled;
}
/**
 * @param int $enabled
 */
public function setEnabled($enabled)
{
 $this->enabled = $enabled;
}
/**
 * @return User
 */
public function getUserTwo()
{
 return $this->user_two;
}
/**
 * @param User $user_two
 */
public function setUserTwo($user_two)
{
 $this->user_two = $user_two;
}
/**
 * @return User
 */
public function getUserOne()
{
 return $this->user_one;
}
/**
 * @param User $user_one
 */
public function setUserOne($user_one)
{
 $this->user_one = $user_one;
}
/**
 * @return int
 */
public function getId()
{
 return $this->id;
}
/**
 * @param int $id
 */
public function setId($id)
{
 $this->id = $id;
}
}

I am 100% sure that my entities are good and that the error come when I want to fill the array.

Look when I do :

foreach($friend_1 as $friends_1) {
 $arrayCollection_1[] = array(
 'id_friend' => 4,
 );
}

That return me :

{
"success": "true",
"message": "Liste du Profil",
"id": 54,
"username": "TestTest7",
"phone": null,
"email": "[email protected]",
"resume": "TestTest7",
"language": null,
"friends_added": [
 {
 "id_friend": 4
 }
],
"friends_accepted": [],
"friends_added_need_to_be_accept": [],
"friends_need_to_be_accept": []
}

Thx for anyone who will try to answer and ask if you want more detail of something that I could forget !

Mickaël Leger
3,4482 gold badges21 silver badges37 bronze badges
asked Jul 31, 2018 at 7:29
8
  • you shouldn't do this in the controller (create service maybe?). Add small DB dump from AppBundle:Friend Commented Jul 31, 2018 at 7:36
  • And what should i do then ? :p Commented Jul 31, 2018 at 7:38
  • if arrays are empty that's mean that you do not have records that meet your criteria Commented Jul 31, 2018 at 7:40
  • Yes i am prety sure you'r right but how can i fill them Commented Jul 31, 2018 at 7:41
  • in your database? Commented Jul 31, 2018 at 7:42

1 Answer 1

2

Implement jsonSerialize on entity classes that are going to be serialized and sent in json format like User. Example

class Friend implements JsonSerializable {
 // previous functions
 /**
 * Specify data which should be serialized to JSON
 * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
 * @return mixed data which can be serialized by <b>json_encode</b>,
 * which is a value of any type other than a resource.
 * @since 5.4.0
 */
 function jsonSerialize()
 {
 return array(
 "id" => $this->id,
 "enabled" => $this->enabled,
 "user_one" => $this->user_one,
 "user_two" => $this->user_two,
 );
 }
}
answered Jul 31, 2018 at 8:01
2
  • that's a lot better but i get : (answer) Commented Jul 31, 2018 at 8:06
  • Response : i just need to do a jsonSerialize to all entities linked, thx you bro Commented Jul 31, 2018 at 8:17

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.