Mat*_*der 1 entity doctrine symfony
在 Symfony 5.4 之前,我曾经这样引用我的实体
public function findAction($archived = false)
{
$em = $this->getDoctrine()->getManager();
$analyses = $em->getRepository('App:Hazardlog\Analysis')->findAll();
Run Code Online (Sandbox Code Playgroud)
我记得不久前有一个以 ::class 结尾的新语法(可能已经在 symfony 4 中),但我一直坚持这种语法,因为我将我的实体组织到子文件夹中(这是旧时代的残余) src 中的代码应该驻留在一堆包中......)。
然而,现在我得到的只是一个简洁的错误:
类“Analysis::class”不存在
这是我的目录结构
Entity
Hazardlog
Analysis
Risk
Run Code Online (Sandbox Code Playgroud)
现在,我尝试了多种方法来在末尾使用 ::class 引用我的实体,但似乎都不起作用。
我可以不将我的目录保留在 symfony 5.4 中吗?还是有一种我没有找到的方法?
我试过了
$analyses = $em->getRepository('App:Hazardlog\Analysis::class')->findAll();
Run Code Online (Sandbox Code Playgroud)
也尝试过
$analyses = $em->getRepository('Hazardlog\Analysis::class')->findAll();
Run Code Online (Sandbox Code Playgroud)
也
$analyses = $em->getRepository('Analysis::class')->findAll();
Run Code Online (Sandbox Code Playgroud)
(我知道最后一个是一个远景,但由于应用程序中只有一个 Analysis 实体,并且 symfony 设置为新语法,我认为 symfony 可能足够聪明,无论如何都能找到它)
这里有什么提示给我吗?
- - - - - - - - - 更新 - - - - - - - -
从 Cerad 的评论中我学到了一些行不通的方法
$analyses = $em->getRepository('App\Entity\Hazardlog\Analysis::class')->findAll();
$analyses = $em->getRepository('App\Entity\Hazardlog\Analysis\Analysis::class')->findAll();
Run Code Online (Sandbox Code Playgroud)
实际工作的方式是
$analyses = $em->getRepository('App\Entity\Hazardlog\Analysis')->findAll();
Run Code Online (Sandbox Code Playgroud)
尽管我不确定这样做是否是一个坏主意,或者我是否应该开始使用“::class”附件来引用它。这有什么区别呢?
将一堆字符括在单引号 ( ') 中使其成为一个字符串。因此'App\Entity\Hazardlog\Analysis::class'是一个字符串。该字符串作为该方法的参数是无效的getRepository,因为它不是有效的类名。因此,您需要使用->getRepository('App\Entity\Hazardlog\Analysis')- 因为这是有效的完全限定类名。
相反,使用Analysis::class(注意,没有引号)。是 php 中为类创建有效的完全限定类名的快捷方式。因此,您可以使用->getRepository(Analysis::class)(再次强调,没有引号),php 将转换该值。在这种情况下,您还会注意到,您必须导入该类 - 因此在类的顶部,您将有类似import App\Entity\Hazardlog\Analysis;. 如果没有导入,这个::class技巧就无法发挥作用。
最后,它们在功能上是相同的。使用哪个是您的偏好。
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |