如何向Symfony 2.1添加命名空间?

时间:2013-02-16 15:23:29

标签: php symfony symfony-2.1

我有一个使用名称空间的第三方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;

供应商目录中的目录结构:

directory structure

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

}

在我的控制器中使用它:

 $bar = new \Example\Foo();

结果:

  

未找到类'示例\ Foo'

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

3 个答案:

答案 0 :(得分:3)

目录结构错误。 UniversalClassLoader(在Symfony< 2.1中使用)和Composer的ClassLoader(在Symfony 2.1中使用)都实现了PSR-0自动加载器标准。此标准要求具有命名空间的文件不能位于根目录中,并且必须至少在一个目录下创建。

这对我有用:

目录结构 working directory structure

//在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/',
);