我在项目中有一个包使用composer和composer.json自动加载如下:
project : TestProject
lines : 13397
authors :
8927 John Doe 66.6%
4447 Jane Smith 33.2%
23 Not Committed Yet 0.2%
现在我将其复制到另一个不使用composer的项目中。我怎么能在那里自动加载这个相同的包呢?
答案 0 :(得分:14)
您必须阅读作曲家并自行为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 CompanyName\PackageName\Test();
当然,我不知道您在PackageName中拥有的类。
/vendor/project
是克隆或下载外部库的位置。这是您拥有composer.json
文件的地方。
注意:这仅适用于psr4自动加载。
编辑:为一个命名空间添加对多个类路径的支持
EDIT2 :我创建了一个Github repo来处理此代码,如果有人想改进它的话。
答案 1 :(得分:3)
是的,这个问题已经过了6个月,但我只是使用了以下内容。
我刚刚找到了以下问题的解决方案。我只是在我的项目文件夹中本地运行命令composer dump-autoload -o
。之后,我只需将./vendor/composer文件夹和/vendor/autoload.php的内容上传到服务器,然后再次运行。
如果您无法在服务器上运行composer,这将非常有用。
答案 2 :(得分:1)
由于许多原因,我不喜欢Composer。第一个原因是共享托管服务不以包的形式提供作曲家,这使得交付低预算的应用程序或简单的MVC自定义框架变得更加困难。这是一种符合PSR4标准的解决方法。
假设您将此自动加载方法添加到根目录中的文件中,并且我们正在自动加载名为“ src”的文件夹中的所有内容的类,此处介绍了如何对此文件进行存档。
define('ROOT', dirname(__DIR__));
define('SLASH', DIRECTORY_SEPARATOR);
spl_autoload_register(function ($className)
{
$fileName = sprintf("%s%ssrc%s%s.php", ROOT, SLASH, SLASH, str_replace("\\", "/", $className));
if (file_exists($fileName))
{
require ($fileName);
}
else
{
echo "file not found {$fileName}";
}
});
现在在每个文件中,您应该添加一个名称空间,如果您有依赖关系,请使用它。这是
中的一个基本示例namespace myapp;
use Core\Example;
此外,在我的示例中,src中的所有文件夹都应以大写字母开头。
完成。干杯@jerryurenaa