如何解决为什么在 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
问题:
-
在文档中似乎使用 normalizationContext 配置的 HTTP 操作没问题(正如预期的那样,PUT 在我的 api 文档中不再可见)但属性不受影响(所有属性仍然在我'我在做一个请求)。我认为序列化组工作不正常...
-
我尝试使用命令“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 举报,一经查实,本站将立刻删除。