PSR4自动加载没有作曲家

时间:2016-09-19 10:52:53

标签: php composer-php autoload

我在项目中有一个包使用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的项目中。我怎么能在那里自动加载这个相同的包呢?

3 个答案:

答案 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