PSR4 auto load without composer(没有作曲家的 PSR4 自动加载)
问题描述
我在一个项目中有一个使用composer自动加载的包,composer.json条目如下:
I have one package in a project which is autoloaded using composer and composer.json entry is as follows :
"autoload": {
"psr-4": {
"CompanyName\PackageName\": "packages/package-folder/src/"
}
}
现在我将其复制到另一个未使用 composer 的项目中.我怎样才能在那里自动加载相同的包?
Now I am copying this over to another project which is not using composer. How can I autoload this same package there ?
推荐答案
您必须阅读 composer 并为 composer.json
中定义的每个命名空间自行加载类.
You have to read the composer and load the classes yourself for each namespaces defined into the composer.json
.
方法如下:
function loadPackage($dir)
{
$composer = json_decode(file_get_contents("$dir/composer.json"), 1);
$namespaces = $composer['autoload']['psr-4'];
// Foreach namespace specified in the composer, load the given classes
foreach ($namespaces as $namespace => $classpaths) {
if (!is_array($classpaths)) {
$classpaths = array($classpaths);
}
spl_autoload_register(function ($classname) use ($namespace, $classpaths, $dir) {
// Check if the namespace matches the class we are looking for
if (preg_match("#^".preg_quote($namespace)."#", $classname)) {
// Remove the namespace from the file path since it's psr4
$classname = str_replace($namespace, "", $classname);
$filename = preg_replace("#\\#", "/", $classname).".php";
foreach ($classpaths as $classpath) {
$fullpath = $dir."/".$classpath."/$filename";
if (file_exists($fullpath)) {
include_once $fullpath;
}
}
}
});
}
}
loadPackage(__DIR__."/vendor/project");
new CompanyNamePackageNameTest();
当然,我不知道你在 PackageName 中有哪些类./vendor/project
是克隆或下载外部库的位置.这是您拥有 composer.json
文件的位置.
Of course, I don't know the classes you have in the PackageName.
The /vendor/project
is where your external library was cloned or downloaded. This is where you have the composer.json
file.
注意:这仅适用于 psr4 自动加载.
Note: this works only for psr4 autoload.
编辑:为一个命名空间添加对多个类路径的支持
EDIT : Adding support for multiple classpaths for one namespace
EDIT2 :我创建了一个 Github repo 来处理这段代码,如果有人想改进它.
EDIT2 : I created a Github repo to handle this code, if anyone wants to improve it.
这篇关于没有作曲家的 PSR4 自动加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:没有作曲家的 PSR4 自动加载
基础教程推荐
- Libpuzzle 索引数百万张图片? 2022-01-01
- 在多维数组中查找最大值 2021-01-01
- 在 Woocommerce 中根据运输方式和付款方式添加费用 2021-01-01
- WooCommerce 中选定产品类别的自定义产品价格后缀 2021-01-01
- 在 PHP 中强制下载文件 - 在 Joomla 框架内 2022-01-01
- 通过 PHP SoapClient 请求发送原始 XML 2021-01-01
- mysqli_insert_id 是否有可能在高流量应用程序中返回 2021-01-01
- XAMPP 服务器不加载 CSS 文件 2022-01-01
- 如何在 PHP 中的请求之间持久化对象 2022-01-01
- 超薄框架REST服务两次获得输出 2022-01-01