Я использую Symfony2 как бэкэнд REST и AngularJS как мой интерфейс (в гибридном мобильном приложении).
Мой интерфейс REST работает нормально, но я не могу удалить дочерний элемент моих коллекций. Я использую jms serli. В этом примере у меня есть контакты, и каждый контакт может иметь много функций. И я хотел бы удалить одну функцию.
Но мой api ничего не удаляет. Я не понимаю, почему.
Вот мой код контроллера:
/**
* Put action
* @var Request $request
* @var integer $id Id of the entity
* @return RestView|array
*/
public function putContactAction(Request $request, $id)
{
$log = $this->get('logger');
$em = $this->getDoctrine()->getManager();
try {
$testContact = $this->get('jms_serializer')->deserialize($request->getContent(), 'Curuba\contactsBundle\Entity\contacts', 'json');
$em->merge($testContact);
$em->flush();
return RestView::create(null, Codes::HTTP_NO_CONTENT);
}
catch(Exception $e) {
$log->error('deserializer issue ' . $e);
}
return RestView::create(null, Codes::HTTP_NO_CONTENT);
}
Вот моя сущность:
/**
* contacts
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Curuba\contactsBundle\Entity\Repository\contactsRepository")
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity(fields={"nom", "prenom"}, message="Ce contact existe déjà.")
*
*/
class contacts
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=80)
*
* @Assert\NotBlank()
*/
private $nom;
/**
* @var string
*
* @ORM\Column(name="prenom", type="string", length=40)
*
* @Assert\NotBlank()
*
*/
private $prenom;
/**
* @var string
*
* @ORM\Column(name="fullname", type="string", length=62, nullable=true)
*/
private $fullname;
/**
* @var \DateTime
*
* @ORM\Column(name="updated", type="datetime")
*
*/
private $updated;
/**
* @var string
*
* @ORM\Column(name="prefix", type="string", length=12, nullable=true)
*
*/
private $prefix;
/**
*
* @var boolean
*
* @ORM\Column(name="communications", type="boolean", nullable=false)
*
*/
private $communications;
/**
* @ORM\ManyToOne(targetEntity="users", inversedBy="contacts")
* @ORM\JoinColumn(nullable=false)
*
* @Assert\NotBlank()
*
*/
private $referent;
/**
* @ORM\ManyToOne(targetEntity="groupes", inversedBy="contacts")
*/
private $groupe;
/**
* @ORM\ManyToOne(targetEntity="sources", inversedBy="contacts")
*/
private $source;
/**
* @ORM\OneToMany(targetEntity="fonctions", mappedBy="contact", cascade={"all"}, orphanRemoval=true)
* @ORM\JoinColumn(nullable=true)
*/
private $fonctions;
/**
* @ORM\OneToMany(targetEntity="Curuba\contactsBundle\Entity\commentaires", mappedBy="contact", orphanRemoval=true, cascade={"remove", "persist"})
* @ORM\JoinColumn(nullable=true)
*/
private $commentaires;
}
Как вы можете видеть ниже, полезная нагрузка исключает функцию id = 2, которая должна быть удалена:
{
"id": 1,
"nom": "lastname",
"prenom": "firstnalastnameme",
"fullname": "fullname, firstname",
"updated": "2015-07-12T14:29:35+0200",
"prefix": "Monsieur",
"communications": true,
"referent": {
"id": 3,
"fullname": "Doe, John"
},
"source": {
"id": 1,
"nom": "source1"
},
"fonctions": [{
"id": 1,
"fonction": "Directeur",
"perso_fixe": "01 01 01 01 01",
"perso_mobile": "06 06 06 06 06",
"updated": "2015-05-25T19:21:03+0200",
"entite": {
"id": 1,
"nom": "Monster",
"adresse": "18 rue de la Paix",
"ville": "Paris",
"cp": "75000",
"updated": "2015-05-22T17:32:06+0200",
}
}]
}
Наконец, я решил определить параметры в качестве ресурса на стороне клиента. Затем я удаляю передачу с помощью вызова. Что мне не нравится в этом решении, так это то, что я делаю это во время редактирования контакта, но его удаление сразу удаляется. Я думаю, мне придется отложить вызов до тех пор, пока пользователь не сохранит контакт... Для получения дополнительной информации на стороне клиента я использую js-данные, которые являются отличной библиотекой для управления данными.