如何在发出 API GET 请求时在 symfony 4 中使用 url 和路由 return 特定数据?
How to return specific data using urls and routing in symfony 4 when making an API GET request?
我是 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 声称的那样,它工作正常并且 return 以下(使用 Sequel Pro 手动添加的数据)列表:
[
{
"id": 14,
"name": "user1 Name"
},
{
"id": 226,
"name": "user2 Name"
},
{
"id": 383,
"name": "user3 Name"
}
]
所以我的下一步是学习如何将此用户列表调整为 return 具有给定 id
的特定用户。所以我跟着official Symfony Docs on Routing。所以我将代码更改为以下内容:
<?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());
}
}
并尝试请求 ID 为 14 的用户的数据,但这没有用并产生了以下错误:
Class App\Entity\User{IdUser} does not exist (500 Internal Server Error)
我还需要做哪些改变才能完成我想做的事情?
这是我的 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
如前所述 - 这就是它不起作用的原因以及如何使其起作用。
让我们检查一下代码:
$this->getDoctrine()->getRepository('App\Entity\User\{IdUser}')->findAll();
基本上你是说:学说,给我负责处理的存储库
实体 App\Entity\User\{IdUser}
从字面上看,当然没有这样的实体 class。
您真正想要的是 App\Entity\User
.
的回购协议
您传递给 getRepository()
方法的字符串必须始终是实体的完全限定 class 名称 - 句号。
为确保您不会在此处出现任何拼写错误,使用实体的 class 常量非常有帮助,它看起来像
$repo = $this->getDoctrine()->getRepository(App\Entity\User::class);
拥有存储库后,您可以调用它的不同方法,如此处的学说文档所示 https://www.doctrine-project.org/api/orm/latest/Doctrine/ORM/EntityRepository.html
在您的例子中,您有变量 $IdUser
,您希望将其映射到用户 class 的数据库 column/entity 属性 id
。
因为你知道你想要这个 ID 为 14 的用户,你所要做的就是告诉 repo 找到一个看起来像这样的用户。
// 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,
]);
希望这比混淆更有帮助 =)
我是 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 声称的那样,它工作正常并且 return 以下(使用 Sequel Pro 手动添加的数据)列表:
[
{
"id": 14,
"name": "user1 Name"
},
{
"id": 226,
"name": "user2 Name"
},
{
"id": 383,
"name": "user3 Name"
}
]
所以我的下一步是学习如何将此用户列表调整为 return 具有给定 id
的特定用户。所以我跟着official Symfony Docs on Routing。所以我将代码更改为以下内容:
<?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());
}
}
并尝试请求 ID 为 14 的用户的数据,但这没有用并产生了以下错误:
Class App\Entity\User{IdUser} does not exist (500 Internal Server Error)
我还需要做哪些改变才能完成我想做的事情?
这是我的 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
如前所述 - 这就是它不起作用的原因以及如何使其起作用。
让我们检查一下代码:
$this->getDoctrine()->getRepository('App\Entity\User\{IdUser}')->findAll();
基本上你是说:学说,给我负责处理的存储库
实体 App\Entity\User\{IdUser}
从字面上看,当然没有这样的实体 class。
您真正想要的是 App\Entity\User
.
您传递给 getRepository()
方法的字符串必须始终是实体的完全限定 class 名称 - 句号。
为确保您不会在此处出现任何拼写错误,使用实体的 class 常量非常有帮助,它看起来像
$repo = $this->getDoctrine()->getRepository(App\Entity\User::class);
拥有存储库后,您可以调用它的不同方法,如此处的学说文档所示 https://www.doctrine-project.org/api/orm/latest/Doctrine/ORM/EntityRepository.html
在您的例子中,您有变量 $IdUser
,您希望将其映射到用户 class 的数据库 column/entity 属性 id
。
因为你知道你想要这个 ID 为 14 的用户,你所要做的就是告诉 repo 找到一个看起来像这样的用户。
// 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,
]);
希望这比混淆更有帮助 =)