【问题标题】:Fallback location for psr-0/4 autoloadingpsr-0/4 自动加载的后备位置
【发布时间】:2017-06-24 08:34:06
【问题描述】:

我正在构建一个 PHP 包,其中有一个文件夹(比如说/vendor/myvendor/packagename/src/Classes),我想使用 PSR-4 自动加载它。

但我还想提供一个选项,将该文件夹从其当前位置复制到项目根目录(比如说 /packagename/Classes,类似于 Laravel 的 publish 命令)。

那么我该如何进行自动加载呢?

我希望 Composer 首先查看该文件夹是否存在于应用程序的根目录下,如果存在则自动加载该文件夹。否则回退到/vendor 内的默认位置。这可能吗?

FWIW,这是 Laravel 特定的包,这意味着我可以使用 Laravel 的 publish 命令将整个文件夹复制到任何地方,但是

  1. 我必须手动将新位置添加到自动加载;
  2. 即使我这样做了,新旧位置之间也会存在命名空间冲突。

【问题讨论】:

    标签: php laravel composer-php autoload


    【解决方案1】:

    我希望 Composer 首先查看该文件夹是否存在于应用程序的根目录下,如果存在则自动加载该文件夹。否则回退到 /vendor 中的默认位置。这可能吗?

    是的,有可能。

    您需要在您的 ServiceProvider 上为您的包裹提及所有内容。

    文档中有关于如何发布您的视图、资产的所有信息,它符合您的需求。

    查看文档:

    https://laravel.com/docs/5.3/packages#public-assets

    我在这里为你复制一些例子:

    如果您想发布您的翻译,您需要执行以下任务:

    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');
    
        $this->publishes([
            __DIR__.'/path/to/translations' => resource_path('lang/vendor/courier'),
        ]);
    }
    

    如果您在 app's lang/vendor/courier 中没有翻译,那么它会退回到您的包翻译。

    你不需要复制你的类代码,它可以保留在你的包目录中。您复制的唯一内容将是您的视图、资产、翻译文件等。

    这应该对你有帮助。

    【讨论】:

    • Paladin 我已经做到了。我知道我可以毫无问题地发布我的包的配置和资产。但我的问题不是关于发布资产或配置,而是关于 PHP 类。如何使用 PHP 类实现相同的结果?如何将 PSR-4 结构化文件夹复制到我的包之外并自动加载并解决命名空间冲突?
    • 我找不到任何需要从包中复制类的场景。如果是这种情况,我建议您不要使用软件包并从您的 app 目录工作。我不知道你的情况,但据我所知,在大多数情况下不应该这样做。如果你能提到你的场景,我可以考虑一下。
    • 是的,我正要对此发表评论。我不太确定这是否是一个好主意,所以这就是为什么我问它是否可取。我的想法是让最终用户能够修改我的代码,而不会弄乱vendor 目录。 John Doe 安装我的包,将 PSR-4 文件夹导出到 /vendor 之外,他们可以随意修改它。这种方法有什么缺点吗?
    • 如果是这种情况,我可能对此知之甚少,让我们等待其他建议,但据我所知,除了命名空间(正如您在题)。在app 中处理代码的人应该只在删除或添加名称空间时更改。可能没有任何其他缺点。
    • 作为参考,我猜我的方法可能会带来不必要的复杂性,包括更新和向后兼容性的潜在问题。以及需要文档,因为它是非标准的。另一种选择是放弃导出 PHP 代码并将我的包放在 GitHub 上的公共仓库中,这样任何人都可以在安装它之前克隆和修改它。
    猜你喜欢
    • 2015-01-08
    • 2014-07-25
    • 2014-03-24
    • 2014-02-14
    • 2013-11-09
    • 2014-08-02
    • 2014-10-19
    • 2019-12-22
    • 2016-10-31
    相关资源
    最近更新 更多