我有一个使用名称空间的第三方lib我想添加到供应商目录。出于某些原因,我不能将composer用于此lib。使用ClassLoader的add方法添加它对我来说不起作用(“找不到类”)。详情:
我正在使用Symfony 2.1.7。
// 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();
结果:
未找到类'示例\ Foo'
我的错误在哪里?和/或:在Symfony 2.1中调试此问题的最佳方法是什么?
答案 0 :(得分:3)
目录结构错误。 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'));
答案 1 :(得分:0)
您有不同的选择:
在实际的自动加载器中注册命名空间。
在app / autoload.php中注册您的命名空间。您可以在此处查看https://github.com/symfony/symfony-standard/blob/2.0/app/autoload.php#L9
的示例将库添加到PHP include_path
将命名空间添加到composer(即使库没有composer.json,也可以在composer.json中添加自定义命名空间)
答案 2 :(得分:0)
在以下文件中,您将看到列出的一些名称空间。你可以用同样的方式添加你的:
// approot/vendor/composer/autoload_namespaces.php
return array(
'Twig_Extensions_' => $vendorDir . '/twig/extensions/lib/',
....
....
'' => $baseDir . '/src/',
);