【问题标题】:add your own library in a symfony project在 symfony 项目中添加你自己的库
【发布时间】:2013-12-31 02:41:38
【问题描述】:

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

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

seculibs/collections/A.phpseculibs/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 中处理的类

【问题讨论】:

  • 你不应该把东西放在供应商文件夹中。里面的东西纯粹是为了写访问。关于缺乏加载,尽管它很烦人,但有时(假设一切都是正确的,但它只是不是“点击”)重启就可以了

标签: symfony vendor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我明白...我说的是如果我想将它们添加到供应商文件夹中
    • 查看我的更新,文件位置无关紧要。重要的是命名空间
    • 我的类是命名空间的......它不会改变任何东西,我必须加载它们......命名空间不够
    【解决方案3】:

    查看 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();
    

    【讨论】:

    • 我的类是命名空间的,所以我写了: $loader->add('seculibs',DIR . '/../vendor/seculibs/collections');当我打电话给他们时,我使用 seculibs/collections/name_of_my_class 但它不起作用
    • 更新您的问题并包含您的一个类的顶部(即命名空间,然后是类减速语句。然后显示一个示例新语句。我还更新了答案。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2014-05-25
    相关资源
    最近更新 更多