Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在发出API GET请求时,如何使用symfony 4中的URL和路由返回特定数据?_Symfony_Symfony4_Symfony Routing - Fatal编程技术网

在发出API GET请求时,如何使用symfony 4中的URL和路由返回特定数据?

在发出API GET请求时,如何使用symfony 4中的URL和路由返回特定数据?,symfony,symfony4,symfony-routing,Symfony,Symfony4,Symfony Routing,我是Symfony的新手,正在努力学习基础知识。我最近看到了,我想了解路由是如何工作的。因此,我从问题中复制了Controller1.php,并将其更改为UserController.php如下: <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonRespon

我是Symfony的新手,正在努力学习基础知识。我最近看到了,我想了解路由是如何工作的。因此,我从问题中复制了
Controller1.php
,并将其更改为
UserController.php
如下:

<?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());
    }
}
因此,我的下一步是学习如何调整此用户列表,以返回具有给定
id
的特定用户。所以我就跟着这个。因此,我将代码更改为以下内容:

<?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());
    }
}
我的
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}
从字面上看,ofc没有这样的实体类。 您真正想要的是
App\Entity\User
的回购

传递给
getRepository()
方法的字符串必须始终是实体句点的完全限定类名。 为了确保这里没有任何输入错误,使用实体的类常量非常有用,如下所示

$repo = $this->getDoctrine()->getRepository(App\Entity\User::class);
一旦拥有了存储库,就可以调用它的不同方法,如这里的条令文档所示 在您的示例中,有一个变量
$IdUser
,您希望将其映射到用户类的db列/实体属性
id
。 既然你知道你想要的正是这个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,
]);

希望这比混淆更有用=)

您有点混淆了=)方法
->getRepository()
返回存储库实例。之后,您希望将idUser传递给存储库的
findOneBy()
方法,如
->findOneBy(['id'=>$idUser])
如documentation@nimmnen中所示<代码>$repo=$this->getDoctrine()->getRepository('App\Entity\User')->findAll()$用户=$repo->findOneBy(['id'=>$IdUser]);返回新的JsonResponse($user)因为这会返回错误:>在对象[]中找不到方法“findOneBy”。>在subject类中找不到引用的方法。
$repo=$this->getdoctor()->getRepository('App\Entity\User')
这将获得存储库实例。然后你做
$user=$repo->findOneBy(['id'=>$IdUser])
@nimmnen这就像一个符咒。谢谢你对我的理解做出贡献!你能不能把你的评论作为答案贴出来,这样我就可以接受了?很高兴你能让它发挥作用。我现在在路上,我知道,但我今天晚些时候回家后,我可以把它变成一个正确的答案,并有更好的解释。o/
$repo = $this->getDoctrine()->getRepository(App\Entity\User::class);
// 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,
]);