【问题标题】:Using Composer's Autoload使用 Composer 的自动加载
【发布时间】:2012-09-30 21:15:27
【问题描述】:

我一直在网上四处寻找这个问题,但没有运气。我在我的composer.json 中使用了composer 的自动加载代码:

"autoload": {
    "psr-0": {"AppName": "src/"}
}

但我需要在比供应商文件夹更高的级别上自动加载。

这样做是行不通的:

"autoload": {
    "psr-0": {"AppName": "../src/"}
}

有谁知道修复方法或我可以如何做到这一点?

【问题讨论】:

    标签: php autoload composer-php


    【解决方案1】:

    只需在您的 src 文件夹中为指向包含您的类的文件夹的命名空间创建一个符号链接...

    ln -s ../src/AppName ./src/AppName
    

    您在 composer 中的自动加载看起来会一样...

    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
    

    现在,您的 AppName 命名空间类将从您当前工作目录的 src 文件夹中启动一个目录...这应该可以工作。

    【讨论】:

    • 您好!谢谢,你是我找到的唯一一个配置,也许你可以帮助我:) 我还创建了一个符号链接,但是当我运行 composer update -o Composer 时不理解类文件夹。你有想法吗 ?请..
    【解决方案2】:

    每个包都应该负责自动加载自己,你想通过自动加载你定义的包之外的类来实现什么?

    如果是针对您的应用程序本身,一种解决方法是向加载器实例添加命名空间,如下所示:

    <?php
    
    $loader = require 'vendor/autoload.php';
    $loader->add('AppName', __DIR__.'/../src/');
    

    【讨论】:

    • 这对于在测试套件中自动加载类很有用,但@chris-r 问题的实际解决方案是运行“composer.phar update”。
    • 非常感谢,经过两个小时的搜索,我找到了这个解决方案,非常感谢你,亲爱的
    • 请注意,函数$loader-&gt;add() 仅使用 PSR-0 加载。对于作为 PSR-4 的加载,请改用 $loader-&gt;addPsr4()
    • @alexndreazevedo 谢谢。自从我的项目遵循 PSR-4 并且使用 add() 无法正确加载以来,我一直在扯头发半小时。我已经提交了对上述答案的更新,以提及正确的 addPsr4() 方法。
    【解决方案3】:

    自动加载配置确实在供应商目录下启动。因此,您可能需要更改供应商目录,例如

    {
        "config": {
            "vendor-dir": "../vendor/"
        },
        "autoload": {
            "psr-0": {"AppName": "src/"}
        }
    }
    

    或者这在你的项目中是不可能的?

    【讨论】:

    【解决方案4】:

    composer documentation 声明:

    添加自动加载字段后,您必须重新运行安装以 重新生成 vendor/autoload.php 文件。

    假设您的“src”目录与“vendor”目录位于同一级别:

      • 应用名称
    • 供应商
    • composer.json

    以下配置绝对正确:

    {
        "autoload": {
            "psr-0": {"AppName": "src/"}
        }
    }
    

    但您必须重新更新/安装依赖项以使其适合您,即运行:

    php composer.phar update
    

    此命令将获取最新版本的依赖项并更新文件“vendor/composer/autoload_namespaces.php”以匹配您的配置。

    同样如@Dom 所述,您可以使用composer dump-autoload 来更新自动加载器,而无需进行更新。

    【讨论】:

    • 你不需要运行 `composer dump-autoload' 吗?
    • @Dom 感谢您的提示,我在答案中添加了 dump-autoload。
    【解决方案5】:

    还有其他方法可以使用作曲家自动加载功能。加载没有命名空间的包或带有自定义自动加载功能的包的有用方法。

    例如,如果您想包含一个包含自动加载功能的单个文件,您可以使用“files”指令,如下所示:

    "autoload": {
        "psr-0": {
            "": "src/",
            "SymfonyStandard": "app/"
        },
        "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
    },
    

    在我们得到的Swagger.php 文件中:

    function swagger_autoloader($className) {
        $currentDir = dirname(__FILE__);
        if (file_exists($currentDir . '/' . $className . '.php')) {
            include $currentDir . '/' . $className . '.php';
        } elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
            include $currentDir . '/models/' . $className . '.php';
        }
    }
    spl_autoload_register('swagger_autoloader');
    

    https://getcomposer.org/doc/04-schema.md#files

    否则您可能需要使用类映射参考:

    {
        "autoload": {
            "classmap": ["src/", "lib/", "Something.php"]
        }
    }
    

    https://getcomposer.org/doc/04-schema.md#classmap

    注意:在您的测试过程中记得启动 composer dump-autoload 命令,否则您将看不到任何变化!

    ./composer.phar dump-autoload
    

    快乐的自动加载 =)

    【讨论】:

      【解决方案6】:

      在我看来,Sergiy's 答案应该是给定问题的选定答案。我正在分享我的理解。

      我正在寻找使用我在下面给出的 dir 结构下的 composer 自动加载我的包文件。

      <web-root>
          |--------src/
          |           |--------App/
          |           |
          |           |--------Test/
          |
          |---------library/
          |
          |---------vendor/
          |           |
          |           |---------composer/
          |           |           |---------autoload_psr4.php
          |           |           
          |           |----------autoload.php
          |
          |-----------composer.json
          |
      

      我正在使用psr-4 自动加载规范。

      必须在项目的 composer.json 中添加以下行。我打算将我的类文件放在 src/App 、 src/Test 和库目录中。

      "autoload": {
              "psr-4": {
                  "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
              }
          } 
      

      这几乎是自我解释。 OrgName\AppType\AppName 是我想要的命名空间前缀。 例如对于 src/App/Controller/Provider/User.php 中的用户类 -

      namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration
      
      use OrgName\AppType\AppName\Controller\Provider\User; // when using the class
      

      还要注意 "src/App"、"src/Test" .. 来自您的 web-root,即您的 composer.json 所在的位置。 与供应商目录无关。看看 vendor/autoload.php

      现在,如果 composer 安装正确,所有需要的就是 #composer 更新

      在作曲家更新我的类后成功加载。 我观察到的是 composer 在 vendor/composer/autoload_psr4.php 中添加了一行

      $vendorDir = dirname(dirname(__FILE__));
      $baseDir = dirname($vendorDir);
      
      return array(
          'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
          'OrgName\\AppType\\AppName\\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
      );
      

      这就是作曲家的映射方式。 对于 psr-0 映射在 vendor/composer/autoload_classmap.php 中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 2021-03-18
        • 2013-02-17
        • 2015-09-08
        • 2013-02-17
        相关资源
        最近更新 更多