Symfony中有没有办法转换像
这样的字符串VendorBundle:Foo
进入像FQCN这样的
Vendor\Bundle\Entity\Foo
Doctrine如何处理这个问题?因为我看到你可以做一些像(伪代码)
的事情->leftJoin( ..., ..., 'WITH', 'alias INSTANCE OF VendorBundle:Entity');
我的问题是由于
$foo = new \Vendor\Bundle\Entity\Foo();
$foo instanceof 'VendorBundle:Foo'; //false
答案 0 :(得分:-2)
您可以使用php关键字::class
PHP.net
在您的情况下,请尝试Foo::class
这应输出类似Vendor\Bundle\Entity\Foo
的字符串。但是,如果您在链接上看到注释,则如果您的控制器中的代码(use Vendor\Bundle\Entity\Foo
)中未包含正确的use语句,则无法保证这一点。如果你正确地包含它,那么你可以调用Foo :: class。
使用doctrine函数,您可以使用您提到的语法VendorBundle:Foo
,如下所示:
$manager = $this->getDoctrine()->getManager();
$fooRepository = $manager->getRepository('VendorBundle:Foo');
$fooBar = $fooRepository->find($someId);
要进行验证,您必须检查
$someStringToCheck = Foo::class;
$foo = new \Vendor\Bundle\Entity\Foo();
$foo instanceof $someStringToCheck //true
奇怪的是,如果你这样做
$foo instanceof Foo::class
它返回错误
但要使用VendorBundle:Foo
,请查看位于AbstractManagerRegistry.php
的\ Doctrine \ Common \ Persistence \ AbstractManagerRegistry中的function getManagerForClass($class)
。您可以在代码中执行以下操作:
$doctrineStyleString = 'VendorBundle:Foo';
if (strpos($doctrineStyleString, ':') !== false)
{
list($namespaceAlias, $simpleClassName) = explode(':', $doctrineStyleString, 2);
$stringWithPath = $this->getDoctrine()->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName;
}
我从该函数中获取代码并尝试了它,因此stringWithPath应该打印Vendor\Bundle\Entity\Foo