使用作曲家的自动加载

我一直在网上寻找,但在这个问题上毫无进展。我使用作曲家的自动加载与这个代码在我的 composer.json:

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

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

这样做是行不通的:

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

有人知道怎么解决吗,或者我该怎么做?

155266 次浏览

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

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

你自动载入的作曲家看起来都一样..。

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

你的 AppName 命名空间类将会从你当前的工作目录启动一个目录到一个 src文件夹... 这样应该可以了。

每个包都应该对自动加载本身负责,对于您定义的包之外的自动加载类,您试图达到什么目的?

如果是针对应用程序本身的,一个解决方案是向加载程序实例添加一个名称空间,如下所示:

<?php


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

自动加载配置确实从供应商目录下面开始。

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

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

作曲家文件指出:

添加 autoload 字段后,必须重新运行 install,以 重新生成供应商/autoload.php 文件。

假设您的“ src”目录与“厂商”目录处于同一级别:

  • Src
    • 应用程序名称
  • 供应商
  • 作曲家 Json

下面的配置是绝对正确的:

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

但是您必须重新更新/安装依赖项才能让它为您工作,例如,运行:

php composer.phar update

这个命令将获得依赖项的最新版本,并更新文件“稳定器/作曲器/autoload _ nampaces.php”以匹配您的配置。

正如@Dom 所指出的,您可以使用 composer dump-autoload来更新自动加载程序,而不必执行更新。

还有其他使用作曲家自动加载特性的方法。在不使用命名空间或自定义自动加载函数附带的包的情况下加载包的有用方法。

例如,如果您希望包含一个包含自动加载函数的单个文件,您可以使用“ 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

注意: 在测试期间请记住启动编曲器 dump-autoload命令,否则您将看不到任何更改!

./composer.phar dump-autoload

快乐自动加载 =)

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

我正在寻找自动加载我的包文件使用作曲家,我有下面给出的目录结构。

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

我使用 PSR-4自动加载规范。

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

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

这几乎是不言而喻的。 应用程序类型应用程序名称是我想要的名称空间前缀。 例如 < em > src/App/Controller/Provider/User.php -中的 User 类

namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration


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

还要注意,“ src/App”、“ src/Test”. . 都来自于您的 web 根目录,这里就是 comper.json 所在的位置。 与供应商 dir 无关

现在,如果编曲器安装正确,所有需要的是 # 作曲家更新

作曲家更新后,我的类成功加载。 我观察到的是,作曲家正在稳定器/作曲家/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映射,它位于厂商/作曲家/autoload _ classmap. php 中