0

我是 Symfony 2 的新手。我想在我的项目中添加库之类的类,但我不知道如何。

假设我有 2 个 A 类和 B 类。

我将它们定位在这个位置: vendor/my_vendor_name/xxxx/A.php 和 vendor/my_vendor_name/xxxx/B.php

在每个类中,我定义了相同的命名空间:

namespace my_vendor_name/xxxx

现在我想通过调用在我的包中使用这两个类:

use my_vendor_name/xxxx/A or my_vendor_name/xxxx/B

但这就像我的命名空间不存在(找不到类)......也许我必须在某处声明这些命名空间,才能注册它们。

我的应用程序/autoload.php

<?php

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';

$loader->add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs');

}

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

return $loader;
4

2 回答 2

2

更深入地查看文档。类加载器组件部分对此进行了很好的解释。

从文档中,

如果要自动加载的类使用命名空间,请使用registerNamespace()registerNamespaces()方法。对于遵循 PEAR 命名约定的类,请使用registerPrefix()registerPrefixes()方法。

注意,文档中充满了满足您需求的示例(向您的项目添加外部类或 PHP 库)

另外,请查看Composer文档的自动加载部分。

于 2013-03-06T10:37:28.957 回答
2

这不是正确的前进方式。

你有,按这个顺序:

  • src/在目录下创建一个包
  • 将您的捆绑包注册到app/AppKernel.php文件中
  • 在你的包下创建你的类
  • 随时随地使用这些课程

真实例子:

捆绑创建

在 dir下创建一个目录src/。这个目录将包含你所有的包。按照惯例,这个目录应该是你的“公司”名称(对于我们的例子,说它是Foo)。

之后,为您的捆绑包创建一个目录,并使用您的捆绑包的名称。对于我们的例子。我们决定称它为FooBundle

因此,您将拥有此目录树:src/Foo/FooBundle/

FooBundle/必须创建一个用于捆绑注册的文件。此处报告此文件:

<?php

namespace Foo\FooBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class FooBundle extends Bundle
{
}

文件名是FooFooBundle.php

注册您的捆绑包

进入app/AppKernel.php文件并添加这一行

public function registerBundles()
{
    [...]
    $bundles = array(
                   [...]
                   new Foo\FooBundle\FooFooBundle());
    [...]

恭喜!您的捆绑包现已注册!

创建您的课程

只需将您的类创建到您的包中。我建议您将它们打包到一个目录中,Core或者您想要的任何目录

使用你的课程

假设您在全新的捆绑包中定义了一个名为 A 的类。

使用它非常简单:

use Foo\FooBundle\Core\A

进入你想使用它的文件

现在一切都应该工作


小提示:

插入 src 的包与插入供应商一的包不同,只是因为您的包(src 一)仅由您使用,仅用于您的项目。供应商捆绑包是您在项目中使用的其他捆绑包。行为(如何创建捆绑包,如何注册和使用它)完全相同。

小注2:

如果您必须使用外部库或“旧” php 普通类,Ahmed 的回答为您提供了一个很好的起点

于 2013-03-06T10:37:39.403 回答