0

我有一个使用命名空间的 3rd 方库,我想添加到供应商目录中。由于某些原因,我不能为此库使用作曲家。使用 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目录中的目录结构:

目录结构

//vendor/example/src/Foo.php
namespace Example;
class Foo {

}

在我的控制器中使用它:

 $bar = new \Example\Foo();

结果:

找不到类“示例\Foo”

我的错误在哪里?和/或:在 Symfony 2.1 中调试此问题的最佳方法是什么?

4

3 回答 3

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'));
于 2013-02-16T19:42:56.477 回答
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中添加自定义命名空间)

于 2013-02-16T16:05:35.633 回答
0

在以下文件中,您将看到列出的一些命名空间。您可以以相同的方式添加您的:

// approot/vendor/composer/autoload_namespaces.php

return array(
    'Twig_Extensions_' => $vendorDir . '/twig/extensions/lib/', 
    ....
    ....
    '' => $baseDir . '/src/',
);
于 2013-03-05T23:54:07.490 回答