微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在 Symfony 项目中使用“php bin/console cache:clear”命令时会出现与 PHP8 #[ApiResource()] 属性相关的错误?

如何解决为什么在 Symfony 项目中使用“php bin/console cache:clear”命令时会出现与 PHP8 #[ApiResource()] 属性相关的错误?

我是开发新手,第一次使用 PHP8 属性,所以我没有线索来猜测问题的根源。 :s

我正在尝试配置 APIPlatform 以确定用户可以看到哪些属性与我的 API 项目中的基本 HTTP 操作相关联。 为此,我为 ApiPlatform 使用 PHP8 属性:#[ApiResource()] 和 #[Groups()]。

我使用的是 PHP8 - Symfony 5.3 - VSCode 1.58.2 - Window 10

问题:

  1. 在文档中似乎使用 normalizationContext 配置的 HTTP 操作没问题(正如预期的那样,PUT 在我的 api 文档中不再可见)但属性不受影响(所有属性仍然在我'我在做一个请求)。我认为序列化组工作不正常...

  2. 我尝试使用命令“PHP bin/console cache:clear”清除symfony缓存。我收到一条消息,告诉我我的 #[ApiResource()] 属性中有解析错误,但我找不到它。

这是我的代码

<?PHP

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use App\Repository\ClientRepository;
use Doctrine\Common\Collections\Collection;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity(repositoryClass=ClientRepository::class)
 */
#[ApiResource(
    collectionoperations: [
        'get' => [
            'normalizationContext' => [
                'groups' => [
                    'read_Client_collection',],'post' => [
            'denormalizationContext' => [
                'groups' => [
                    'write_Client_item',itemOperations: [
        'get' => [
            'normalizationContext' => [
                'groups' => [
                    'read_Client_item','delete','patch' => [
            'denormalizationContext' => [
                'groups' => [
                    'write_Client_item',)]
class Client
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    #[Groups(['read_Client_collection','read_User_collection','read_User_item'])]
    private $id;

    /**
     * @ORM\Column(type="string",length=75)
     */
    #[Groups(['read_Client_collection','read_Client_item','read_User_item','write_Client_item'])]
    private $companyName;

    /**
     * @ORM\Column(type="string",length=20,nullable=true)
     */
    #[Groups(['read_Client_item','write_Client_item'])]
    private $phoneNumber;

    /**
     * @ORM\Column(type="string",length=255)
     */
    #[Groups(['read_Client_item','write_Client_item'])]
    private $address;

    /**
     * @ORM\Column(type="string",length=45)
     */
    #[Groups(['read_Client_item','write_Client_item'])]
    private $SiretNumber;

    /**
     * @ORM\OnetoMany(targetEntity=User::class,mappedBy="client")
     */
    private $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

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

    public function getCompanyName(): ?string
    {
        return $this->companyName;
    }

    public function setCompanyName(string $companyName): self
    {
        $this->companyName = $companyName;

        return $this;
    }

    public function getAddress(): ?string
    {
        return $this->address;
    }

    public function setAddress(string $address): self
    {
        $this->address = $address;

        return $this;
    }

    public function getSiretNumber(): ?string
    {
        return $this->SiretNumber;
    }

    public function setSiretNumber(string $SiretNumber): self
    {
        $this->SiretNumber = $SiretNumber;

        return $this;
    }

    public function getPhoneNumber(): ?string
    {
        return $this->phoneNumber;
    }

    public function setPhoneNumber(?string $phoneNumber): self
    {
        $this->phoneNumber = $phoneNumber;

        return $this;
    }

    /**
     * @return Collection|User[]
     */
    public function getUsers(): Collection
    {
        return $this->users;
    }

    public function addUser(User $user): self
    {
        if (!$this->users->contains($user)) {
            $this->users[] = $user;
            $user->setClient($this);
        }

        return $this;
    }

    public function removeUser(User $user): self
    {
        if ($this->users->removeElement($user)) {
            // set the owning side to null (unless already changed)
            if ($user->getClient() === $this) {
                $user->setClient(null);
            }
        }

        return $this;
    }
}

这是当我尝试“PHP bin/console cache:clear”命令时终端中的错误(第 32 行是“itemOperations: [”之前的那个):

ParseError {#6596
#message: "Syntax error,unexpected ','"
#code: 0
#file: "D:\...\project\src\Entity\Client.PHP"
#line: 32
trace: {
D:\...\project\src\Entity\Client.PHP:32 {
    Symfony\Component\ErrorHandler\DebugClassLoader->loadClass(string $class): void^
    ›     ],› ],› itemOperations: [
}
Symfony\Component\ErrorHandler\DebugClassLoader->loadClass() {}
spl_autoload_call() {}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:1123 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:1245 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:1300 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:1220 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:1053 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:1035 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:869 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:719 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\DocParser.PHP:376 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\AnnotationReader.PHP:178 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\PsrCachedReader.PHP:155 { …}
D:\...\project\vendor\doctrine\annotations\lib\Doctrine\Common\Annotations\PsrCachedReader.PHP:88 { …}
D:\...\project\vendor\api-platform\core\src\Util\AnnotationFilterExtractorTrait.PHP:47 { …}
D:\...\project\vendor\api-platform\core\src\Util\AnnotationFilterExtractorTrait.PHP:112 { …}
D:\...\project\vendor\api-platform\core\src\Bridge\Symfony\Bundle\DependencyInjection\Compiler\AnnotationFilterPass.PHP:65 { …}
D:\...\project\vendor\symfony\dependency-injection\Compiler\Compiler.PHP:91 { …}
D:\...\project\vendor\symfony\dependency-injection\ContainerBuilder.PHP:749 { …}
D:\...\project\vendor\symfony\http-kernel\Kernel.PHP:545 { …}
D:\...\project\vendor\symfony\http-kernel\Kernel.PHP:786 { …}
D:\...\project\vendor\symfony\http-kernel\Kernel.PHP:125 { …}
D:\...\project\vendor\symfony\framework-bundle\Console\Application.PHP:168 { …}
D:\...\project\vendor\symfony\framework-bundle\Console\Application.PHP:74 { …}
D:\...\project\vendor\symfony\console\Application.PHP:167 { …}
D:\...\project\vendor\symfony\runtime\Runner\Symfony\ConsoleApplicationRunner.PHP:56 { …}
D:\...\project\vendor\autoload_runtime.PHP:35 { …}
D:\...\project\bin\console:11 { …}
}
}

我试过没有成功:

  • 将我的群组名称从“write:Client:collection”更改为“write_Client_Collection”

  • 在 Collectionoperations 之前添加一个属性:[]

    #[APIResource( 属性: [ '集合操作' => [ // ... ],'项目操作' => [ // ... ] ]) ]

  • 将所有属性规范放在一行中,如下所示:

    #[ApiResource(collectionoperations: ['get' => ['normalizationContext' => ['groups' => ['read_Client_collection','post' => ['denormalizationContext' => [ 'groups' => ['write_Client_item',itemOperations: ['get' => ['normalizationContext' => ['groups' => ['read_Client_item',' delete','patch' => ['denormalizationContext' => ['groups' => ['write_Client_item',)]

它适用于解析错误...但我的 API 文档完全是空的。

  • 我尝试在 VS Code 中将我的 windows 行尾 CRLF 更改为 linux LF,但它不起作用。

我的想法快用完了... 谢谢你的帮助:)

注意:问题并非特定于该实体文件:当我抑制 Client 实体中的 ApiResource 属性时,问题切换到项目的其他资源实体。

解决方法

我设法解决了我的问题...我不知道其他人是否可以参与解决方案,但以防万一...

  • 问题 1:标准化组不起作用:

通过写作

'normalizationContext' => [

我混合了两种不同的语法:

#[ApiResource(
    normalizationContext: ['groups' => ['read']],denormalizationContext: ['groups' => ['write']],)]

#[ApiResource(attributes: [
    'normalization_context' => ['groups' => ['read']],'denormalization_context' => ['groups' => ['write']],])]

我用 'normalization_context' 替换了 'normalizationContext' 并且组现在工作正常...

  • 问题 2:当我使用“symfony cache:clear”命令时,#[ApiAttributes()] 中的解析错误:

我的 PHP 8.0.3 由 symfony 项目所在文件夹根目录下的 .php-version 文件决定,但我的 Windows 系统的其余部分运行 PHP 7.3.12。 我也将系统 PHP 版本更改为 8.0.3,现在问题已解决。

(在窗口 10,对于像我这样的菜鸟:

  • 右键单击屏幕左下角的 Windows 图标
  • 点击“系统”
  • 点击“高级系统参数”(屏幕右侧)
  • 点击“环境变量”按钮
  • 在系统变量中,选择“路径”并点击“修改”
  • 如果您想要的 php 版本不在列表中,请添加路径。
  • 选择它并将其移动到 php 版本列表的顶部。)

我认为问题是由于我的 composer 安装造成的:我为它进行了全局安装,因此当我更改 composer.json 文件以指示 php >=8.0 时,此操作会与系统上运行的 PHP 版本产生冲突.当我尝试“作曲家更新”命令时,一条消息告诉我。

也许我错了,所以如果有人能证实我的解释,那就太好了。谢谢大家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。