具有 Composer 自动加载功能的 PHP 命名空间

问题描述 投票:0回答:1

我想将几个库移至 Composer/Packagist,并且正在努力处理 php 命名空间映射。

  • 类文件位于 /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" }
    },

相同的结果。这些文件位于

src/Csp
直接位于
vendor/Theking2/csp-builder
创建的文件夹
compose update
下。

就在有人问之前:是的,每个文件中都有一个

namespace Csp;

php composer-php
1个回答
1
投票

使用

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

设置包

我们想要什么

让我们假设这些先决条件:

实体 价值
供应商 金山软件
正在开发的包 csp 构建器
开发者/登录用户 开玩笑
github用户开发 国王2
Packagist 名称 金山软件
PHP 命名空间 金山\Csp
源根 来源/

让我们假设该包不依赖于任何东西并且具有 MIT 许可证,所有这些都不相关。

我们来作曲吧!

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

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
。在生成的
composer.json

中执行此操作
    "autoload": {
        "psr-4": {
            "Kingsoft\\Csp\\": "src/"
        }
    },

现在假设文件夹

src/
中的源文件以及直接位于其中的源文件具有

namespace Kingsoft\Csp;

接近顶部。 (可能就在

<?php declare(strict_types=1);
之后。)

承诺并推动

现在提交此内容并将其与您使用的任何 git 提供商上的存储库同步。也许在那之前标记它:

git tag 1.0.0

包装主义者

在 Packagist 上,在帐户

csp-builder
下设置一个新包 (
kingsoft
),并在将 Packagist 帐户与 GitHub 帐户连接后将相关挂钩添加到例如 GitHub。 (不知道如何在其他 git 托管商上做到这一点,请在评论中留言)。

在设置过程中不涉及代码的小更改(拼写错误等)可能需要提交并重新标记

git tag 1.0.1 --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);

我正在写这个相当详尽的答案,以供我自己将来参考。

© www.soinside.com 2019 - 2024. All rights reserved.