使用Composer自动加载的PHP命名空间

px9o7tmv  于 2023-04-04  发布在  PHP
关注(0)|答案(1)|浏览(192)

我想把几个库移到Composer/Packagist,并且正在努力解决php命名空间Map问题。

  • 类文件在/src下的文件夹Csp中。它们有一个PHP命名空间Csp。
  • compose init生成的composer.json包含(不确定是否正确)
"autoload": {
        "psr-4": {
            "Theking2\\Csp\\": "src/"
        }
    },
  • 该软件包已在Packagist https://packagist.org/packages/theking2/上注册
  • 在一个测试项目,我需要的包
  • index.php中,我按照文档
require_once __DIR__ . '/vendor/autoload.php';
$csp = new Csp\Builder(true);

但是我得到了一个类找不到的错误。
composer.json中编辑:

"autoload": {
        "psr-4": { "Csp\\": "src/Csp" }
    },

或者这个

"autoload": {
        "psr-0": { "Csp\\": "src/Csp" }
    },

相同的结果。这些文件位于vendor/Theking2/csp-builder下的文件夹src/Csp中,因为compose update创建了它。
在有人问之前:是的,每个文件中都有一个namespace Csp;

vyswwuz2

vyswwuz21#

使用composer init时需要考虑几件事。第一个问题(<vendor><name>)定义了很多内容,默认为用户登录的位置(?)以及她正在工作的文件夹。当然,这可以改变,但需要提前考虑。因此,请一步一步地进行。

设置包

我们想要的
让我们假设这些先决条件:
| 实体|价值|
| --------------|--------------|
| 卖主|金山|
| 开发中的软件包|csp-builder|
| 开发人员/登录用户|开玩笑|
| github用户开发|国王2|
| Package 商名称|金山|
| PHP命名空间|金山词霸\CSP|
| 源根|源代码/|
让我们假设这个包不依赖于任何东西,并且有一个MIT许可证,所有这些都不相关。

一起作曲吧!

composer init的第一个问题的答案必须更改为kingsoft/csp-builder。第9个问题(PSR-4自动加载Map)的答案可以回答是肯定的,但我们必须稍后更改该答案的效果。生成后,观察最后几行:

Generating autoload files
Generated autoload files
PSR-4 autoloading configured. Use "namespace Kingsoft\CspBuilder;" in src/
Include the Composer autoloader with: require 'vendor/autoload.php';

自动加载器调整

这是一个很好的猜测,但我们希望将名称空间更改为Kingsoft\Csp

"autoload": {
        "psr-4": {
            "Kingsoft\\Csp\\": "src/"
        }
    },

现在假设文件夹src/中的源文件和直接位于其中的源文件具有

namespace Kingsoft\Csp;

靠近顶部。(可能直接在<?php declare(strict_types=1);之后。)

提交推流

现在提交这个代码,并将其与你使用的任何git提供程序上的repo同步。也许在此之前标记它:

git tag 1.0.0

打包员

在Packagist上,在账户kingsoft下设置一个新的包(csp-builder),并在将Packagist账户与GitHub账户连接后将相关的钩子添加到例如GitHub。(不知道如何在其他git主机上这样做,请在评论中留言)。
在安装过程中不涉及代码的小更改(错别字等)可能需要提交并重新标记

git tag 1.0.0 --force && git push -f --tags

当然,在代码更改之后,您可能(必须)向新版本添加标记。
这是大部分的工作。现在..

使用包

这很简单。创建一个composer.json,其中包含以下最少的内容:

{
    "require": {
        "kingsoft/csp-builder": "*"
    }
}

在终端里输入这个

composer update

并使用Kingsoft\Csp中包含的任何内容。例如

$csp = new Kingsoft\Csp\Builder(true);
$csp-> setCspHeader();

或者通过导入命名空间来缩短导入的名称:use Kingsoft\Csp;,并在类名等中省略供应商名称(但要包括命名空间Csp\!),如new Csp\Builder(true);
我写这个相当详尽的答案是为了我自己将来的参考。

相关问题