【问题标题】:Autoloader for distributed PHP plugins that includes composer packages包含作曲家包的分布式 PHP 插件的自动加载器
【发布时间】:2017-06-16 16:17:08
【问题描述】:

我正在使用要求用户上传扩展程序的 CMS。

用户无权访问 composer。所以我需要在发行版本身中包含依赖项。

我如何实现它来自动加载所有依赖项?这是解决这个问题的方法吗?

这是分布式扩展的简化目录结构。 (用户应该上传上传目录的内容):

upload/Eg/
upload/Eg/autoload.php <-- autoloader to load the dependencies
upload/Eg/MyClass.php <-- requires autoload.php
upload/Eg/dependencies <-- where required composer packages are copied
upload/Eg/dependencies/guzzlehttp <-- for example

自动加载.php

spl_autoload_register(function ($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
});

MyClass.php

namespace Eg;

require './autoload.php';

use GuzzleHttp;

class MyClass {
}

旁注:我正在编写的应用程序实际上是自动“构建”扩展。从 composer 的“vendor”文件夹复制依赖是自动完成的。

【问题讨论】:

  • 我不明白这是什么问题。
  • @yivi 这个实现是否有效以及它是否是一个好方法的问题。
  • 你试过了吗? “这是一个好方法吗”是一个见仁见智的问题,对于 SO 来说不是一个好问题。并且首先通过实际测试代码来回答“它是否有效”。如果你这样做了,但它没有,那么你就问一个具体的问题。 :)

标签: php autoloader spl-autoload-register


【解决方案1】:

用户无权访问 composer。所以我需要在发行版本身中包含依赖项。

你在这里重新发明轮子。 Composer 是开源的,所以我只需看一下并检查是否可以重用它的代码和逻辑。您可能可以轻松摆脱 90% 的代码,但自动加载器和 composer.json 扫描应该是您所需要的。

【讨论】:

  • 在没有建设性批评的情况下投反对票是毫无用处的。
  • 投反对票的不是我,而是我看过作曲家。需要深入研究。
  • Composer 的源代码结构良好,所以我相信您可以复制和粘贴大部分代码而无需更改。当然,如果您没有很多用例,您可以重新发明轮子,这可能是一种选择(例如,composer 的灵活性可能对您的需求来说太过分了)。但如果不是,他们就是我要先检查 Composer 的来源的方式。但这不会像(很可能是懒惰的投票者希望)那样花费 1 分钟,但绝对应该得到回报..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2014-07-04
  • 2015-09-24
  • 2018-04-02
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多