gpt4 book ai didi

php - PSR-4:自动加载器( Composer )和扩展命名空间确保后备 php

转载 作者:行者123 更新时间:2023-12-04 18:20:47 26 4
gpt4 key购买 nike

我的命名空间回退和在 Composer 中使用 PSR-4 加载程序时遇到问题。

我想做的是:

  1. 拥有一个可以覆盖/扩展的核心。
  2. 核心基于接口(interface)。

目录结构如下:

site/app/View/Example.php
site/src/ACME/app/View/Example.php
site/src/ACME/app/Interface/View.php

我还没有设置此配置,因此如果您有更好的建议,请采纳。

我的 Composer json 对于 psr-4 来说是这样的:

 "autoload": {
"psr-4": {
"ACME\\App\\Site\\" : "app/",
"ACME\\App\\" : "src/AMCE/app/"
}
}

我认为如果找不到站点,这将使 ACME\App\Site\View 回退到 ACME\App\View(请注意,我还没有完成界面部分...)。

我的 site/app/View/Example.php 代码如下:

namespace ACME\App\Site\View;

class ViewExample extends View {

当我也有 site/app/View/View.php 时,这有效。看起来像:

namespace ACME\App\Site\View;

class View extends \ACME\App\View\View {

site/src/app/View/View.php 如下所示:

namespace ACME\APP\View;

class View {

这个应该使用接口(interface)(我还没试过)。

所以我真正想做的是做到这一点,这样我就不必拥有 site/app/View/View.php,也不必拥有 site/app/View/Example.php - 它可以使用 site/src/ACME/app/View/Example.php。

抱歉,我对命名空间不熟悉,所以我可能无法很好地表达它。

我的意思是我认为 ACME\App\Site 会回退到 ACME\App - 但事实并非如此?还是我做错了?目前它需要所有文件就位。

最佳答案

编辑:事实证明我最初是错的,你的示例可以与 PSR-4 一起使用!您只需为可以从不同位置加载的命名空间指定一个目录数组。

简单的解决方案

{
"autoload": {
"psr-4": {
"ACME\\App\\Site\\": ["app/", "src/ACME/app"],
"ACME\\App\\": "src/ACME/app/"
}
}
}

就我个人而言,我宁愿更明确地命名我的命名空间,请参见下文。

原始答案

尝试加载不存在的文件时,Composer PSR-4 加载器不会回退。它只是立即失败。它的流程如下:

  1. \ACME\App\Site\View 未加载
  2. 扫描 PSR-4 条目以查找匹配的命名空间
  3. 类名称与命名空间 \ACME\App\Site(您的第一个 PSR-4 条目)匹配。
  4. 加载文件app/View.php
  5. 文件不存在。错误。

它永远不会返回到步骤 3 并尝试下一个命名空间。

那么我该如何解决这个问题?

您似乎想将可重用库代码与站点代码分开。如果是这样的话,我会使用单独的命名空间。例如,使用 ACME\Site 命名空间来保存可重用代码,并使用 ACME\MySiteName 来保存特定于站点的代码。这样就不会出现歧义,并且 Composer 加载类时不会遇到任何问题。

但我不想重新排列我的命名空间!

好的,没问题,但是您必须使用 hack 来解决您的问题。 Composer 有一个 classmap 加载器,您必须使用它来代替首选的 PSR-4 加载器。

{
"autoload": {
"classmap": ["app/", "src/"]
}
}

关于php - PSR-4:自动加载器( Composer )和扩展命名空间确保后备 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com