Как вернуть определенные данные, используя URL-адреса и маршрутизацию в Symfony 4 при выполнении запроса API GET? - PullRequest
2 голосов
/ 15 июня 2019

Я новичок в Symfony и пытаюсь изучить основы. Я недавно видел этот вопрос , и я хотел узнать, как работает маршрутизация. Поэтому я скопировал Controller1.php из вопроса и изменил его на UserController.php this:

<?php


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class UsersController extends AbstractController
{
    /**
     * @Route("/listOf/Users", methods={"GET"})
     * @param Request $request
     * @return JsonResponse
     */
    public function list(Request $request)
    {
        if (empty($request->headers->get('api-key'))) {
            return new JsonResponse(['error' => 'Please provide an API_key'], 401);
        }

        if ($request->headers->get('api-key') !== $_ENV['API_KEY']) {
            return new JsonResponse(['error' => 'Invalid API key'], 401);
        }

        return new JsonResponse($this->getDoctrine()->getRepository('App\Entity\User')->findAll());
    }
}

Который действительно, как утверждает OP, работает нормально и возвращает следующий (вручную добавленные данные, используя Sequel Pro) список:

    [
    {
        "id": 14,
        "name": "user1 Name"
    },
    {
        "id": 226,
        "name": "user2 Name"
    },
    {
        "id": 383,
        "name": "user3 Name"
    }
    ]

Таким образом, мой следующий шаг состоял в том, чтобы узнать, как настроить этот список пользователей, чтобы возвращать определенного пользователя с заданным id. Таким образом, я следовал официальным документам Symfony о маршрутизации . Поэтому я изменил код на следующий:

<?php


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class UsersController extends AbstractController
{
    /**
     * @Route("/listOf/Users/{IdUser}", requirements={"IdUser"="\d+"},  methods={"GET"})
     * @param Request $request
     * @param int $IdUser
     * @return JsonResponse
     */
    public function list(Request $request, int $IdUser)
    {
        if (empty($request->headers->get('api-key'))) {
            return new JsonResponse(['error' => 'Please provide an API_key'], 401);
        }

        if ($request->headers->get('api-key') !== $_ENV['API_KEY']) {
            return new JsonResponse(['error' => 'Invalid API key'], 401);
        }

        return new JsonResponse($this->getDoctrine()->getRepository('App\Entity\User\{IdUser}')->findAll());
    }
}

и попытался запросить данные пользователя с идентификатором 14, но это не сработало и выдало следующую ошибку:

Class App \ Entity \ User {IdUser} не существует (500 Внутренняя ошибка сервера)

Какие еще изменения мне нужно сделать, чтобы иметь возможность делать то, что я пытаюсь сделать?

Это моя User.php сущность:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User implements \JsonSerializable
{

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

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

    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 jsonSerialize()
    {
        return get_object_vars($this);
    }
}

И в моем UserRepository.php нет ничего, кроме автоматически сгенерированного кода.

Редактировать: Мой первый запрос, который работал, имел форму: http://domainName.local:80/listOf/Users, а мой второй был: http://domainName.local:80/listOf/Users/14

1 Ответ

1 голос
/ 15 июня 2019

Как и было обещано ранее - вот почему это не работает и как заставить его работать.

Давайте рассмотрим удар по коду:

$this->getDoctrine()->getRepository('App\Entity\User\{IdUser}')->findAll();

По сути, вы говорите: доктрина, дайя хранилище, которое отвечает за обработку сущности App\Entity\User\{IdUser} буквально и, конечно, такого класса сущностей нет.Что вам действительно нужно, так это репо для App\Entity\User.

Строка, которую вы передаете методу getRepository(), всегда должна быть полностью определенным именем класса объекта-периода.Чтобы здесь никогда не было опечаток, очень полезно использовать константу класса сущности, которая выглядит так:

$repo = $this->getDoctrine()->getRepository(App\Entity\User::class);

Как только у вас есть хранилище, вы можете вызывать его различными методами, как показано вДокументация доктрины здесь https://www.doctrine -project.org / api / orm / latest / Doctrine / ORM / EntityRepository.html В вашем случае у вас есть переменная $IdUser, которую вы хотите отобразить наСвойство db column / entity id пользовательского класса.Поскольку вы знаете, что вам нужен именно этот пользователь с идентификатором 14, все, что вам нужно сделать - это попросить репо найти именно того, который выглядит следующим образом.

// here's the example for your specific case
$user = $repo->findOneBy(['id' => $IdUser]);

// another example could be e.g. to search a user by their email address
$user = $repo->findOneBy(['email' => $email]);

// you can also pass multiple conditions to find*By methods
$user = $repo->findOneBy([
    'first_name' => $firstName,
    'last_name' => $lastName,
]);

Надеюсь, это было бы более полезным, чем запутать=) * +1022 *

...