Форум программистов, компьютерный форум, киберфорум
Наши страницы
Symfony
Войти
Регистрация
Восстановить пароль
 
Dialkord228
5 / 5 / 4
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
#1

Symfony3 REST API Catalog - Symfony

18.02.2018, 23:11. Просмотров 206. Ответов 2

Нужно сделать каталог у которого будет бесконечное количество подкаталогов (бесконечная вложенность). Методом POST нужно отослать JSON массив с новым наименованием каталога и его родителя, и записать все это в базу данных, используя doctrine. Сделал я yml файл для базы данных:
Код
AppBundle\Entity\Category:
  type: entity
  manyToOne:
      parent:
          targetEntity: AppBundle\Entity\Category
          inversedBy: children
          joinColumn:
              name: parentId
              referencedColumn: id
  oneToMany:
      children:
          targetEntity: AppBundle\Entity\Category
          mappedBy: parent
  table: category
  repositoryClass: AppBundle\Repository\CategoryRepository
  id:
      id:
          column: id
          type: integer
          id: true
          generator:
              strategy: AUTO
  fields:
      name:
          type: string
          lenght: 255
Entity для этого каталога:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
 
namespace AppBundle\Entity;
 
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
 * Category
 */
class Category
{
    /**
     * @var integer
     */
    private $id;
 
    /**
     * @var string
     */
    private $name;
    /**
     * @var category
     */
    private $parent;
 
    /**
     * @var arrayCollection
     */
    private $children;
 
 
    public function __construct()
    {
       $this->children = new ArrayCollection();
    }
 
    /**
     * @return ArrayCollection
     */
    public function getChildren()
    {
        return $this->children;
    }
 
    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
 
    /**
     * @return Category
     */
    public function getParent()
    {
        return $this->parent;
    }
 
    /**
     * @param Category $parent
     */
    public function setParent($parent)
    {
        $this->parent = $parent;
    }
 
    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
 
    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }
 
}
И сам контроллер:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
namespace AppBundle\Controller;
 
use JMS\Serializer\Serializer;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AppBundle\Entity\Category;
use FOS\RestBundle\View\View;
use FOS\RestBundle\Controller\FOSRestController;
use Doctrine\Common\Collections\ArrayCollection;
 
class CatalogController extends FOSRestController
{
 public function postAction(Request $request)
    {
        $array = [];
        if ($content = $request->getContent()) {
            $array = json_decode($content, true);
        }
 
        $result = new Category();
 
        $result->setName($array['name']);
        //$result->setParent($array['parentId']); //<----тут не хочет записывать
 
        $em = $this->getDoctrine()->getManager();
        $em->persist($result);
        $em->flush();
 
        return new View("Category Added Successfully", Response::HTTP_OK);
 
    }
}
Почему-то когда я хочу записать в бд новую категорию, то если указывать только имя, то всё нормально запишется, но если попытаюсь записать ИД родителя, то выдает 500 ошибку. Подскажите, что нужно поправить, чтобы всё корректно записывало? Еще я не уверен, правильно ли я расставил взаимосвязи. Буду рад любой помощи. Заранее благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2018, 23:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Symfony3 REST API Catalog (Symfony):

Logout в Symfony3
Делаю авторизацию на симфони 3 по документации, в итоге получился вот такой...

JMS Serializer Symfony3 - PHP
Нужно выполнить десериализацию данных, полученных в виде JSON массива через...

Создание теста для контроллера в Symfony3
Есть контроллер: &lt;?php namespace AppBundle\Controller; use...

Как сделать множество связей One-to-one Symfony3 doctrine
К таблице Tours нужно прикрепить 2 таблицы ToursMeta и ToursMarkup, работает...

1C и REST API
День добрый. Может ли 1С отвечать на запросы REST API инициируемые сторонним...

Rest api
обьясните рууским языком, что такое REst Api,Api?

2
Jewbacabra
Эксперт PHP
3093 / 2680 / 1226
Регистрация: 24.04.2014
Сообщений: 8,195
18.02.2018, 23:53 #2
Цитата Сообщение от Dialkord228 Посмотреть сообщение
$result->setParent($array['parentId']); //<----тут не хочет записывать
Потому что тут нужно не число, а объект. Т.е нужно из бд по $array['parentId'] достать сущность и использовать уже ее.
1
Dialkord228
5 / 5 / 4
Регистрация: 30.11.2015
Сообщений: 106
Завершенные тесты: 1
19.02.2018, 00:56  [ТС] #3
Jewbacabra, я немного не понял, а можно хоть какой-то пример кода, как это можно реализовать?

Добавлено через 10 минут
Jewbacabra, что-то типа такого?
PHP
1
2
3
$parentId = $this->getDoctrine()->getRepository('AppBundle:Category')->find($array['parentId']);
/...../
$result->setParent($parentId->get('id'));
Добавлено через 25 минут
Jewbacabra, вот так сделал, вроде работает:
PHP
1
2
3
$parentId = $this->getDoctrine()->getRepository('AppBundle:Category')->find($array['parentId']);
//...........................,//
$result->setParent($parentId);
еще я убрал relationship OneToMany, а то как-то всё запутанно было.
В итоге yml файл стал таким:

AppBundle\Entity\Category:
type: entity
manyToOne:
parent:
targetEntity: AppBundle\Entity\Category
inversedBy: name
joinColumn:
name: parentId
referencedColumn: id
repositoryClass: AppBundle\Repository\CategoryRepository
id:
id:
column: id
type: integer
id: true
generator:
strategy: AUTO
fields:
name:
type: string
lenght: 255
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2018, 00:56
Привет! Вот еще темы с решениями:

Подключение REST API
Добрый день! Недавно начал изучать AngularJS. И застрял вот на такой веще....

REST API в Delphi
Доброго времени суток. Столкнулся с такой проблемой как работа с REST API....

REST api Dropbox
Успешно получаю токен доступа, но никак не могу составить правильно запрос ...

Yandex REST API
Здравствуйте! Разбираюсь с Yandex REST API. Я смог разобраться, как работать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru