【问题标题】:How to add a personal vendor to a Symfony 2 project?如何将个人供应商添加到 Symfony 2 项目中?
【发布时间】:2013-03-06 19:50:55
【问题描述】:

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

假设我有 2 个 A 和 B 类。

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

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

namespace my_vendor_name/xxxx

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

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;

【问题讨论】:

    标签: symfony


    【解决方案1】:

    这不是正确的处理方式。

    你有,按这个顺序:

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

    实例:

    包创建

    在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 的 bundle 与插入 vendor one 的 bundle 不同,只是因为您的 bundle(src one)仅供您使用,仅用于您的项目。供应商捆绑包是您在项目中使用的其他捆绑包。行为(如何创建捆绑包,如何注册和使用它)完全相同。

    小注2:

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

    【讨论】:

    • 谢谢,我要试试...顺便说一下,我听说加载器上有一个 autoload.php 文件和一个 registerNameSpaces 方法...你知道吗?
    • @mlwacosmos:是的,它是“小音符2”。艾哈迈德已经写过了,所以我不再重复;)
    【解决方案2】:

    更深入地查看文档。 The ClassLoader Component 部分对此进行了很好的解释。

    从文档中,

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

    注意,文档是 full of examples 满足您的需求(向您的项目添加外部类或 PHP 库)

    另外,请查看Composer 文档的autoload 部分。

    【讨论】:

    • 谢谢你...所以我只需要在 autoload.php 中添加: $loader->registerNamespace('my_vendor_name/xxxx', DIR.'/vendor/ my_vendor_name/xxxx');
    • 问题:它说方法 registerNamespace 不存在...显然不是好的加载器
    • @mlwacosmos 您应该在您的 autoload.php 文件中有一个 $loader->registerNamespaces() 调用来注册您的 Sf2 依赖项,不是吗?如果您添加的类带有命名空间,最好使用 registerPrefixes()。
    • registerPrefixes() 也不存在。我更新了我的问题以显示我的 autoload.php
    • @mlwacosmos 好的,感谢您的更新,如何使用 $loader->add('XXX', DIR.'/../vendor/XXX_PATH'); ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2012-11-28
    • 2012-10-03
    • 2022-01-22
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多