【问题标题】:symfony: autowire has null function without being nullsymfony:autowire 具有 null 功能而不为 null
【发布时间】:2021-02-16 13:39:31
【问题描述】:

我尝试为我的 symfony API 制作控制器,但是使用 symfony 的自动装配功能总是返回 null,当我使用函数 $trustedUser->getName() 时代码返回 null

当我使用函数时,代码返回 null:$trustedUser->getName() 在控制器中 getTrustedUserByID()

    $this->logger->info($trustedUser->getName()." ".$trustedUser->getId());
    return new JsonResponse([
        "name" => $trustedUser->getName(),
    ]);

我的控制器如下所示:

<?php

namespace App\Controller;

use App\Entity\Status;
use App\Entity\TrustedUser;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Psr\Log\LoggerInterface;


class TrustedUserController extends AbstractController
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
    /**
     * @Route("/trustedUser/{id}", name="getTrustedUserByID", methods={"GET","HEAD"})
     */
    public function getTrustedUserByID(TrustedUser $trustedUser,$id)
    {
        if (!$trustedUser) {
            throw $this->createNotFoundException(
                'No trustedUsers found for id '.$id
            );
        }
        $this->logger->info($trustedUser->getName()." ".$trustedUser->getId());
        return new JsonResponse([
            "name" => $trustedUser->getName(),
        ]);
    }
}

我的实体是这样的:

<?php

namespace App\Entity;

use App\Repository\TrustedUserRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=TrustedUserRepository::class)
 */
class TrustedUser
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

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

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

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

    /**
     * @ORM\Column(type="integer")
     */
    private $phone;

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

    /**
     * @ORM\OneToOne(targetEntity=Status::class, inversedBy="trustedUser", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=true)
     */
    private $id_status;

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

    public function getCivilite(): ?string
    {
        return $this->civilite;
    }

    public function setCivilite(string $civilite): self
    {
        $this->civilite = $civilite;

        return $this;
    }

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

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

        return $this;
    }

    public function getLastname(): ?string
    {
        return $this->lastname;
    }

    public function setLastname(string $lastname): self
    {
        $this->lastname = $lastname;

        return $this;
    }

    public function getPhone(): ?int
    {
        return $this->phone;
    }

    public function setPhone(int $phone): self
    {
        $this->phone = $phone;

        return $this;
    }

    public function getMail(): ?string
    {
        return $this->mail;
    }

    public function setMail(string $mail): self
    {
        $this->mail = $mail;

        return $this;
    }

    public function getIdStatus(): ?Status
    {
        return $this->id_status;
    }

    public function setIdStatus(Status $id_status): self
    {
        $this->id_status = $id_status;

        return $this;
    }
}

我的存储库如下所示:

<?php

namespace App\Repository;

use App\Entity\TrustedUser;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method TrustedUser|null find($id, $lockMode = null, $lockVersion = null)
 * @method TrustedUser|null findOneBy(array $criteria, array $orderBy = null)
 * @method TrustedUser[]    findAll()
 * @method TrustedUser[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class TrustedUserRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, TrustedUser::class);
    }

    // /**
    //  * @return TrustedUser[] Returns an array of TrustedUser objects
    //  */
    /*
    public function findByExampleField($value)
    {
        return $this->createQueryBuilder('t')
            ->andWhere('t.exampleField = :val')
            ->setParameter('val', $value)
            ->orderBy('t.id', 'ASC')
            ->setMaxResults(10)
            ->getQuery()
            ->getResult()
        ;
    }
    */

    /*
    public function findOneBySomeField($value): ?TrustedUser
    {
        return $this->createQueryBuilder('t')
            ->andWhere('t.exampleField = :val')
            ->setParameter('val', $value)
            ->getQuery()
            ->getOneOrNullResult()
        ;
    }
    */
}

实体和存储库都是使用 make:entity 生成的

And the database looks like this The results looks like this

【问题讨论】:

  • 请澄清“不断返回 null”的含义。 $trustedUser 是否设置为 null?似乎不太可能,因为这会产生不同的错误消息。
  • 对不起!问题是我使用 $trustedUser 获得的所有函数都返回 null ,如此屏幕截图 i.gyazo.com/240b7ce2e516f764e2a54676ee235a05.png 所示,如 $trustedUser->getName() 我不知道是什么原因造成的
  • 请通过编辑您的问题分享更多详细信息 - 代码在哪里确切返回 null,这与自动装配有何关系?
  • 我编辑了问题以准确显示代码返回 null 的位置
  • 这是您的代码还是您继承的遗留项目?我想不出在没有设置属性的情况下注入 $trustedUser 的方法。您是否仔细检查过数据库表中的 name 列是否具有实际值?

标签: symfony


【解决方案1】:

在我看来,这不像是自动装配问题 - Doctrine 实体不是自动装配的,而是通过 ParamConverter 加载的。这可以通过提供实体的 ID 将实体注入到控制器方法中。

要使其正常工作,您需要安装包sensio/framework-extra-bundle。此软件包包含转换器。

此外,如果您不需要控制器中的原始 ID,则无需注入它。如果找不到实体,包的转换器将自行抛出异常

【讨论】:

  • 我安装了这个包,它工作了!我现在收到正确的数据!非常感谢!至于我为什么使用 $id 是因为在新版本中出于某种原因it returns me an error if i try to use $id directly
  • 是的,但是通过那个 ParamConverter,如果无法加载实体,控制器方法根本不会被调用
  • 那么有没有办法解决这个错误直接使用 $id ?
  • 你说的是哪个错误?使用给定的代码,!$trustedUser 可以评估为true,因为这是总是 TrustedUser 的实例没有
  • 我说的是未定义的变量“$id”。当我尝试删除 getTrustedUserByID(TrustedUser $trustedUser,$id) shown here 中的 id 定义时
猜你喜欢
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2019-07-22
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多