Php 如何将名称空间添加到Symfony 2.1?
我有一个使用名称空间的第三方库,我想添加到供应商目录中。由于某些原因,我无法将composer用于此库。使用ClassLoader的add方法添加它对我不起作用(“找不到类”)。详细内容: 我使用的是Symfony 2.1.7Php 如何将名称空间添加到Symfony 2.1?,php,symfony,symfony-2.1,Php,Symfony,Symfony 2.1,我有一个使用名称空间的第三方库,我想添加到供应商目录中。由于某些原因,我无法将composer用于此库。使用ClassLoader的add方法添加它对我不起作用(“找不到类”)。详细内容: 我使用的是Symfony 2.1.7 // app/autoload.php use Doctrine\Common\Annotations\AnnotationRegistry; $loader = require __DIR__.'/../vendor/autoload.php'; $loader->
// app/autoload.php
use Doctrine\Common\Annotations\AnnotationRegistry;
$loader = require __DIR__.'/../vendor/autoload.php';
$loader->add('Example', realpath(__DIR__.'/../vendor/example/src'));
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;
供应商目录中的目录结构:
//vendor/example/src/Foo.php
namespace Example;
class Foo {
}
在我的控制器中使用它:
$bar = new \Example\Foo();
结果:
找不到类“Example\Foo”
我的错在哪里?和/或:在Symfony 2.1中调试此问题的最佳方法是什么?您有不同的选项: 在实际的自动加载程序中注册名称空间 在app/autoload.php中注册您的命名空间。你可以在这里看到一个例子 将库添加到PHP include_路径
将命名空间添加到composer(即使库中没有composer.json,也可以在composer.json中添加自定义命名空间)您有不同的选项: 在实际的自动加载程序中注册名称空间 在app/autoload.php中注册您的命名空间。你可以在这里看到一个例子 将库添加到PHP include_路径
将命名空间添加到composer(即使库中没有composer.json,也可以在composer.json中添加自定义命名空间)目录结构错误。UniversalClassLoader(用于Symfony<2.1)和Composer的ClassLoader(用于Symfony 2.1)都实现了PSR-0自动加载标准。此标准要求具有名称空间的文件不能位于根目录中,并且必须在至少一个目录下创建 这对我很有用: 目录结构 //在autoload.php中
// Symfony 2.1 using Composer's ClassLoader
$loader->add('Example', realpath(__DIR__.'/../vendor/example/example/src'));
目录结构错误。UniversalClassLoader(用于Symfony<2.1)和Composer的ClassLoader(用于Symfony 2.1)都实现了PSR-0自动加载标准。此标准要求具有名称空间的文件不能位于根目录中,并且必须在至少一个目录下创建 这对我很有用: 目录结构 //在autoload.php中
// Symfony 2.1 using Composer's ClassLoader
$loader->add('Example', realpath(__DIR__.'/../vendor/example/example/src'));
在下面的文件中,您将看到列出了一些名称空间。您可以使用相同的方式添加您的:
// approot/vendor/composer/autoload_namespaces.php
return array(
'Twig_Extensions_' => $vendorDir . '/twig/extensions/lib/',
....
....
'' => $baseDir . '/src/',
);
在下面的文件中,您将看到列出了一些名称空间。您可以使用相同的方式添加您的:
// approot/vendor/composer/autoload_namespaces.php
return array(
'Twig_Extensions_' => $vendorDir . '/twig/extensions/lib/',
....
....
'' => $baseDir . '/src/',
);
对symphony不太清楚,但在使用
$bar=new\example\Foo()实例化symphony之前,您可能会尝试使用vendor/example/src/Foo.php
@Sheikheera如果不在自动加载器中定义名称空间将无法工作。symphony不太确定,但在使用$bar=new\example\Foo()实例化之前,您可能会尝试使用vendor/example/src/Foo.php
@SheikhHeera如果不在自动加载程序中定义名称空间将无法工作。他们将添加名称空间从2.0更改为2.1,因为现在使用的是Composer的类加载程序,所以旧的“registerNamespaces”方法在2.1中不再起作用。这就是我在示例代码中使用add()方法的原因。您在这里犯了一个错误。../vendor/autoload.php中没有registerNamespaces,但UniveralClassLoader中存在该方法。只需创建加载程序并注册它。您可以在同一时间启用多个加载程序。最终,您发现,目录结构是错误的(请参阅下面的答案)。无论如何,谢谢!:-)他们将添加名称空间从2.0改为2.1,因为现在使用了Composer的类加载器,所以旧的“registerNamespaces”方法在2.1中不再有效。这就是我在示例代码中使用add()方法的原因。您在这里犯了一个错误。../vendor/autoload.php中没有registerNamespaces,但UniveralClassLoader中存在该方法。只需创建加载程序并注册它。您可以在同一时间启用多个加载程序。最终,您发现,目录结构是错误的(请参阅下面的答案)。无论如何,谢谢!:-)令人惊叹的。谢谢我在symblog教程中需要这个。我添加的两行代码是:$loader->add('Enquiry',realpath(\uu DIR\uu.'/../src/Blogger/BlogBundle/Entity')$loader->add('inquiryType',realpath(\uuuu DIR\uuuu.'/../src/Blogger/BlogBundle/Form')代码>太棒了。谢谢我在symblog教程中需要这个。我添加的两行代码是:$loader->add('Enquiry',realpath(\uu DIR\uu.'/../src/Blogger/BlogBundle/Entity')$loader->add('inquiryType',realpath(\uuuu DIR\uuuu.'/../src/Blogger/BlogBundle/Form')代码>