1

我之前问过类似的问题,但没有正确的答案。也许我没有解释好。

我有 2 个我自己的类,我想在 symfony 项目中添加它们。

seculibs/collections/A.php并且seculibs/collections/B.php(它不在github上,它是本地的)。

我想在 vendor 文件夹中添加我的 seculibs 文件夹并要求 symfony 加载这些类。

显然一切都发生在app/autoload.php

我认为这样做可以,但不是:

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

它仍然找不到课程。

有人可以告诉我具体该怎么做吗?我使用 Symfony 2.3.6

请不要提及composer.json及其UniversalClassLoader方法registerNamespaces,因为这不是我要处理的类autoload.php

4

3 回答 3

1

所以我找到了正确的语法......它会帮助其他人

$loader->add('seculibs\\collections',__DIR__ . '/../vendor');
于 2013-12-13T14:00:40.883 回答
0

你必须自动加载课程吗?我通过在我的项目中简单地给它们一个命名空间来使用我自己的类,然后use在我想在其中使用它们的文件中将它们包含在一个语句中。例如,我有一个类放在其中的自定义位置我的项目,src/My/AppBundle/Utils/MyClass.phpMyClass.php文件中,我给了命名空间My/AppBundle/Utils

现在在一个控制器中,我将该类包含在一个普通的use语句中。

use My/AppBundle/Utils/MyClass.php
// .....

class MyController extends Controller {
    // ....
}

这样我就可以通过引用命名空间在我的应用程序的任何地方使用我的类。我知道这种方法可能与您的预期不同,但效果很好。

更新:

将文件放在哪里并不重要。如果您希望将它们放在 vendor 文件夹中,请将它们放在那里,并给它们一个有意义的命名空间。

所以也许你有这样的事情:

// in vendors/MyUtils/Classes/MyClass.php

namespace MyUtils/Classes

class MyClass {
    // ....
}

然后你仍然可以用use我提到的语句来包含这个类。

于 2013-12-12T15:56:08.923 回答
0

查看 vendor/composer/ClassLoader.php 您可以看到 add 方法需要一个前缀作为第一个参数。如果您的类没有命名空间,您可以将其留空。

假设您的类没有命名空间,然后使用:

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

$a = new \A();

如果他们确实有命名空间,那么只需传递命名空间的前缀即可添加。

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

namespace Cerad\Collections;
class A {}

$a = new Cerad\Collections\A();

当然,您还必须在您的供应商目录下拥有 Cerad\Collections 目录结构。

===============================================

更新

如果您在 /vendor/seculibs/collectionsA.php 中有:

namespace seculibs\collections;

class A {

然后使用:

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

use seculibs\collections\A;

$a = new A();
于 2013-12-12T16:32:09.330 回答