使用Composer的自动加载
在这个问题上,我一直在寻找networking,没有运气。 我在composer.json中使用composer的自动加载代码:
"autoload": { "psr-0": {"AppName": "src/"} }
但我需要自动加载比供应商文件夹更高的级别。
做这样的事情是行不通的:
"autoload": { "psr-0": {"AppName": "../src/"} }
有谁知道一个修补程序,或者我怎么能做到这一点?
每个软件包都应该负责自动加载自己,你试图通过自动加载你所定义的软件包之外的类来实现什么function?
一个解决方法,如果它是您的应用程序本身是添加一个名称空间到加载器实例,如下所示:
<?php $loader = require 'vendor/autoload.php'; $loader->add('AppName', __DIR__.'/../src/');
composer php文件指出:
添加自动加载字段后,您必须重新运行安装程序以重新生成vendor / autoload.php文件。
假设你的“src”dir和“vendor”dir位于同一层:
- SRC
- AppName的
- 供应商
- composer.json
以下configuration是绝对正确的:
{ "autoload": { "psr-0": {"AppName": "src/"} } }
但是您必须重新更新/安装依赖关系才能使其工作,即运行:
php composer.phar update
这个命令会更新文件“vendor / composer / autoload_namespaces.php”来匹配你的configuration。
还有其他的方法来使用composer php自动加载function。 加载不带名称空间的程序包或包含自定义自动加载函数的程序包的方法。
例如,如果你想包含一个包含自动加载函数的文件,你可以使用“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
注意:在你的testing过程中记得启动composer dump-autoload
命令,否则你将看不到任何改变!
./composer.phar dump-autoload
快乐自动加载=)
在我看来, Sergiy的答案应该是针对特定问题的select答案。 我分享我的理解。
我正在寻找自动装载我的包文件使用composer php,我已经在下面给出的目录结构。
<web-root> |--------src/ | |--------App/ | | | |--------Test/ | |---------library/ | |---------vendor/ | | | |---------composer/ | | |---------autoload_psr4.php | | | |----------autoload.php | |-----------composer.json |
我正在使用psr-4自动加载规范。
必须在项目的composer.json中添加下面的内容。 我打算将我的类文件放在src / App,src / Test和library目录中。
"autoload": { "psr-4": { "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"] } }
这是非常自我解释。 OrgName \ AppType \ AppName是我想要的命名空间前缀。 例如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-root的,这是你的composer.json所在的地方。 与供应商目录没有任何关系。 看看vendor / autoload.php
现在,如果composer php安装正确,所需的只是#composer更新
composer php更新我的类成功加载后。 我观察到的是composer php在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'), );
这是如何composer php地图。 psr-0映射在vendor / composer / autoload_classmap.php中
自动加载configuration确实在供应商目录下启动。 所以你可能想改变供应商目录,例如
{ "config": { "vendor-dir": "../vendor/" }, "autoload": { "psr-0": {"AppName": "src/"} } }
或者在你的项目中这是不可能的?
只需在src文件夹中为指向包含类的文件夹的名称空间创build一个符号链接…
ln -s ../src/AppName ./src/AppName
您在composer php的自动加载将看起来一样…
"autoload": { "psr-0": {"AppName": "src/"} }
而你的AppName命名空间类将从src
文件夹中的当前工作目录开始一个目录…应该工作。