Symfony4 сеттер, где getter match id route? - PullRequest
0 голосов
/ 11 ноября 2018

Я новичок в Symfony

Я делаю систему голосования, но я думаю, что это должно работать как,

На данный момент моя функция контроллера такова, это только создает новую строку с 1 голосом, но не обновляет любой $ id, созданный ранее.

/**
     * @Route("/public/{id}/vote", name="poll_vote", methods="GET|POST")
     */
    public function vote(Request $request, Poll $poll): Response
    {
       $inc = 1;
       $em = $this->getDoctrine()->getManager();
       $entity = new Poll();
       $entity->setVotes($inc++);
       $em->persist($entity);
       $em->flush();
       }
       return $this->redirectToRoute('poll_public');
    }

Это моя кнопка из шаблона веточки

<a href="{{ path('poll_vote', {'id': poll.id}) }}">

Это моя сущность

  class Poll
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $votes;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getVotes(): ?int
    {
        return $this->votes;
    }

    public function setVotes(?int $votes): self
    {
        $this->votes = $votes;

        return $this;
    }
}

Я понятия не имею, как можно сопоставить мой getID с моей сущностью и сопоставить $ id с @ Route.

Любой гид или предложение будет очень признателен.

Спасибо

EDIT:

Обновлено с правильной функцией после ответа Арне:

/**
     * @Route("/public/{id}", name="poll_vote", methods="GET|POST")
     */
    public function vote($id)
    {
    $entityManager = $this->getDoctrine()->getManager();
    $poll = $entityManager->getRepository(Poll::class)->find($id);

    if (!$poll) {
        throw $this->createNotFoundException(
            'No polls found for id '.$id
        );
    }

    $poll->setVotes($poll->getVotes()+1);
    $entityManager->flush();

    return $this->redirectToRoute('poll_public', [
        'id' => $poll->getId()
    ]);
    }

1 Ответ

0 голосов
/ 11 ноября 2018

В основном вам нужно получить идентификатор из вашего запроса, запросить хранилище данных для вашей организации опроса, обновить голоса и сохранить его обратно в базу данных.

  1. Получите ID по вашему запросу

    $ id = $ request-> query-> get ('id');

  2. Запрос к хранилищу:

    $ entityManager = $ this-> getDoctrine () -> getManager ();

    $ poll = $ entityManager-> getRepository (Poll :: class) -> find ($ id);

  3. Обновление голосов:

    $ poll-> setVotes ($ poll-> getVotes () + 1);

  4. Сохранить в базе данных:

    $ entityManager-> сохраняются ($ опрос);

    $ entityManager-> заподлицо ();

В качестве альтернативы вы также можете использовать ParamConverter , чтобы позволить Symfony получить объект Poll для вас. Более подробную информацию об обновлении объектов можно найти в Doctrine Guide .

Обратите внимание, что ваш маршрут будет соответствовать только существующим опросам, поскольку id является обязательным параметром в URL. Вы можете добавить другой маршрут без идентификатора, который используется для создания новых объектов опроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...