0

这篇文章专门讨论似乎存在的添加您自己的命名空间的简单解决方案,即在 app/autoload.php 中使用加载器的解决方案。

有很多文档都在谈论诸如 registerNamespace 或 registerPrefix 之类的魔术方法。

问题是 UniversalClassLoader 对象存在这些方法。

我下载了 Symfony 标准版 2.2,app/autoload.php 看起来更像这样(与 Symfony 标准版 2.1 几乎相同):

use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = require __DIR__.'/../vendor/autoload.php';

// intl
if (!function_exists('intl_get_error_code')) {
  require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
}

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;

实际上使用的加载器是作曲家加载器。如果您希望添加 'seculibs/collections' 命名空间,则可以使用的唯一方法是像这样的 'add' 方法,例如:

$loader->add("seculibs\\collections", __DIR__.'/../vendor/seculibs/collections/');

但这似乎不起作用:当我执行程序时,我对 /seculibs/collections/xx.php 有相同的 classNotFound

所以我像这样更改了 autoload.php :

    require_once ('/../vendor/symfony/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php');

use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = require __DIR__.'/../vendor/autoload.php';
$universalLoader = new UniversalClassLoader();

$universalLoader->registerNamespace("seculibs\\collections", __DIR__.'/../vendor/seculibs/collections/');
$universalLoader->register();

// intl
if (!function_exists('intl_get_error_code')) {    
    require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';

}

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;

没有...

但显然它适用于很多人所以..我做错了什么?他们有其他一些可以在秘密网站上找到的 Symfony 版本吗?

其中一门课是这样的:

namespace seculibs\collections;

class LinkedMap {
    private $items;

    public function __construct() {
        $this->items = array();
    }

    public function __destruct() {
        unset($this->items);
    }

 ....
4

2 回答 2

1

您可以将自己的库添加到 composer.json 自动加载配置中,因此即使它们不是由 composer 加载的,它们也会在生成的自动加载器中。

"autoload": {
    "psr-0": {
        "": "src/",
        "MyLib_": "/home/sites/MyLib"
    }
},
于 2013-03-07T16:19:43.350 回答
1
$loader->add('seculibs\\collections',__DIR__ . '/../vendor');

new LinkedMap();

假设你有文件:vendor/seculibs/collections/LinkedMap.php

通常,您的库中会有另一个级别。就像是:

供应商/MyStuff/seculibs/collections

然后添加行将指向 vendor/MyStuff

于 2013-03-07T16:34:06.233 回答