psr-0和作曲家是如何工作的?

时间:2014-02-17 09:04:52

标签: symfony composer-php autoload psr-0

我会用一个例子问这个问题。 假设我有一个类似的项目目录。

project

  vendor

      samplevendor

  src

  composer.json

首先我想知道我是否已将composer.json文件正确放置在项目目录中以便在供应商目录中安装库?第二,假设我有以下几行composer.json

 "autoload":{
      "psr-0": {
              "samplevendor\\package": "lib/"
                }
            }

那么composer会在哪里配置自动加载以查找关于项目根目录的类samplevendor \ package \ sampleclass? 在symfony2 composer.locked文件中看到以下行之后我问这个:

 "autoload": {
            "psr-0": {
                "Doctrine\\Common\\Annotations\\": "lib/"
            }
        }

更新:我在autoload_namespaces.php中找到了相应的命名空间映射,它似乎与psr-0不一致:

'Doctrine \ Common \ Annotations \'=> array($ vendorDir。'/ doctrine / annotations / lib')

1 个答案:

答案 0 :(得分:1)

您可能可以根据要求将composer.json放在项目的任何位置,但对于纯PHP(和HTML / CSS / JS)项目,最好将文件放在最顶层的目录中。这样,如果你创建一个库或想要一些其他好的副作用,Composer就能找到它。 (其中有很多不会直接影响Composer或您的软件的工作方式)。

最好通过运行composer.json来创建初始composer init。 Composer会询问您有关供应商名称和软件名称的信息。我建议你在这里给出一个合理的答案。此外,您可以将自己添加为开发人员,立即添加一些依赖项(不一定需要),最后创建初始文件。

PSR-0自动加载意味着要在目录中搜索命名空间或类名的给定前缀(记住那些Underscore_Classname_Namespace_Emulation),即配置为\Namespace\Class的名为"psr-0": {"Namespace\\": "src"}的类将是位于src/Namespace/Class.php(如果文件不在那里,也许另一个组件能够加载那个确切的类,因此自动加载不会立即失败 - Composer将注册该失败并查看以后的自动加载定义是否可以加载它)。

您在autoload_namespaces.php文件中看到所需库的不同定义是正确的。 Composer必须从位于vendor内的不同目录加载这些目录,并且您自己的类将从composer.json文件中自动加载部分中给出的位置自动加载。