Symfony6+PHP8创建无数据库Entity表单报错及注解替代咨询
报错根因
Warning: Undefined variable $name和注解、属性配置无关,是基础PHP语法错误:
你代码中写的$this->$name属于可变属性访问语法,PHP会尝试读取当前作用域下$name局部变量的值,将这个值作为属性名去类里查找对应属性。但你在get/set方法里并没有定义$name局部变量,才会抛出未定义变量警告。
正确的类属性访问写法是去掉属性名前的$,即$this->name。
修正后的可正常使用的非数据库绑定模型代码
<?php namespace App\Model; // 非数据库关联的普通模型建议放到Model目录,不要放Entity目录避免被Doctrine自动扫描识别为数据库实体 class MyObject { // PHP 7.4+支持的原生类型声明已经完全覆盖旧版@var注解的类型声明作用,无需额外加注释配置 private string $name = ''; // 给属性设置默认值,避免读写时出现未初始化属性报错 public function getName(): string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } }
关于PHP8原生Attribute替代旧@var注解的说明
PHP 8.0 开始正式支持原生Attribute(属性)语法,用来替代旧版本通过DocBlock解析的各类注解:
- 纯类型声明场景:PHP原生的类型声明(比如示例代码里写的
private string $name、参数/返回值的string类型约束)已经完全替代@var的类型定义作用,不需要额外加任何属性或者注解。 - 框架元数据读取场景:各个生态库都已经适配了原生Attribute语法,比如Doctrine对应字段声明的
#[ORM\Column]、Symfony序列化组件对应序列化规则的#[SerializedName]、#[Groups]等,这类属性和旧版DocBlock注解一一对应,不需要自行实现。 - 无数据库关联的表单绑定模型:不需要加任何ORM相关的注解/属性,只要getter、setter写法符合Symfony PropertyAccess组件的规则,表单就能正常完成数据绑定、读写,不会出现渲染报错。
额外提醒:symfony console make:entity命令默认生成的是绑定Doctrine数据库的实体类,会自动加上ORM相关的注解/属性,如果只是做不连库的表单绑定模型,不需要用这个命令生成,手动创建普通PHP类即可。
内容的提问来源于stack exchange,提问作者C. MARTIN
相关产品推荐
相关产品推荐

