从VendorBundle:实体到FQCN

时间:2015-12-16 15:14:18

标签: symfony doctrine-orm

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

1 个答案:

答案 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