【问题标题】:Add custom namespaces in Symfony 2 with universalLoader使用 UniversalLoader 在 Symfony 2 中添加自定义命名空间
【发布时间】:2013-03-07 14:50:28
【问题描述】:

这篇文章专门介绍似乎存在的添加您自己的命名空间的简单解决方案,即在 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);
    }

 ....

【问题讨论】:

  • 你想达到什么目的?
  • 我在 vendor/seculibs/collections 中有 2 个类...我想使用加载器方法在我的包中使用它们
  • 这些类本身是命名空间的吗?发布其中一个的前几行(直到并包括课程行),有人可能会给你一个准确的答案。
  • 好的课程...我更新我的答案,向您展示其中一门课程

标签: symfony namespaces


【解决方案1】:
$loader->add('seculibs\\collections',__DIR__ . '/../vendor');

new LinkedMap();

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

通常,您的库中会有另一个级别。比如:

供应商/MyStuff/seculibs/collections

然后添加行将指向 vendor/MyStuff

【讨论】:

  • 为什么只是 vendor ?为什么不是 vendor/seculibs/collections ?我的命名空间是针对这个位置的,不是所有供应商都没有?
  • 因为它就是这样工作的。您指向包含命名空间而不是类的目录。这也是为什么我说你通常会有另一个目录在那里。看看其他供应商,看看他们是如何做到的。
  • 好的......它可以工作......但我仍然希望有人让它与'registerNamespace'等方法一起工作......如果没有人回答......我会给你点,因为你的帮助非常感谢
  • S2.0 使用了它自己的 UniversalLoaderClass,它有一个 registerNamespace 方法。 S2.1 切换到使用只有 add 方法的 composer loader。所以基本上,您需要确保您查看的是正确的文档。
  • 很有趣...但我正在查看编写文档:类加载器组件...他们甚至在文档中说在 Symfony 2.1 中他们在他们正在谈论的加载器对象上添加了一个新方法关于
【解决方案2】:

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

"autoload": {
    "psr-0": {
        "": "src/",
        "MyLib_": "/home/sites/MyLib"
    }
},

【讨论】:

  • 我试过了,它确实对我有用,我不知道为什么......另外我想用装载机的方法......谢谢
  • 好的,这种风格确实有效,所以它是另一回事。为什么不想让作曲家来处理呢?
  • 因为我在 composer.json 中添加了 : "seculibs\\collections": "vendor/seculibs/collections" 并且它没有改变任何东西......另外我想了解为什么文档给出了一个解决方案,它不能像我现在看到的那样应用
  • 顺便说一句,我猜我改了composer.json后,我得用composer.phar写一个命令行吧?
  • 检查它放入生成自动加载器 (vendor/composer/autoload_namespaces.php) 的内容是否正确使用该格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
相关资源
最近更新 更多