微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Symfony 框架中使用 openpgp-php 尝试从命名空间“App\Controller”加载类“OpenPGP_SecretKeyPacket”

如何解决在 Symfony 框架中使用 openpgp-php 尝试从命名空间“App\Controller”加载类“OpenPGP_SecretKeyPacket”

我找到了这个答案,它帮助了我一半: How do you use the PHP OpenPGP library?

首先,由于依赖关系,我真的没有通过下载它来正确设置它。但是当我运行 Symfony 并安装了 Composer 时,我终于通过运行 composer require singpolyma/openpgp-PHP 在 Symfony 中安装了 pgp(但不工作),将它和依赖项安装到供应商文件夹中。

如果我有如下要求,我可以在独立的 PHP 文件中使用 pgp,但这在控制器中不起作用(即使我添加了要求,它也不会比没有失败更多或更少)

require("../vendor/PHPseclib/PHPseclib/PHPseclib/Crypt/RSA.PHP");
require("../vendor/PHPseclib/PHPseclib/PHPseclib/Crypt/Hash.PHP");
require("../vendor/PHPseclib/PHPseclib/PHPseclib/Math/BigInteger.PHP");
require("../vendor/singpolyma/openpgp-PHP/lib/openpgp_crypt_rsa.PHP");

在 Symfony 的 AbstractController 中,它不是那样工作的。 我粉碎了我的大脑,我应该使用哪个“使用”命令,我只是没有更多的想法。

来自 composer.json 的名字是

"name": "singpolyma/openpgp-PHP",

但减号不是命名空间中的有效名称

我通常会收到错误

尝试从命名空间“App\Controller”加载类“OpenPGP_SecretKeyPacket”。 您是否忘记了另一个命名空间的“use”语句?

<?PHP
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;

class PageApiController extends AbstractController
{
    /**
    @Route("/ApiTest",methods={"GET"})
    */
    public function ApiTest(EntityManagerInterface $entityManager)
    {
        $rsa = new \PHPseclib\Crypt\RSA(); // HERE comes the ERROR
        $k = $rsa->createKey(512);
        $rsa->loadKey($k['privatekey']);

        $nkey = new OpenPGP_SecretKeyPacket(array(
        'n' => $rsa->modulus->toBytes(),'e' => $rsa->publicExponent->toBytes(),'d' => $rsa->exponent->toBytes(),'p' => $rsa->primes[2]->toBytes(),'q' => $rsa->primes[1]->toBytes(),'u' => $rsa->coefficients[2]->toBytes()
        ));

        $uid = new OpenPGP_UserIDPacket('Test <test@example.com>');

        $wkey = new OpenPGP_Crypt_RSA($nkey);
        $m = $wkey->sign_key_userid(array($nkey,$uid));

        // Serialize private key
        $Data = $m->to_bytes();

        return $this->json(['Test' => $Data]);
    }
}

我必须承认我不习惯 PHP 中的命名空间,我知道我还没有真正理解 symphony 中发生了什么。我非常感谢任何有关 Symfony 中命名空间的提示

解决方法

这里实际上涉及两个库。 phpseclib 是命名空间的,所以像 RSA 类这样的东西可以与一个简单的 new RSA() 一起使用。然而,OpenPGP 的东西没有命名空间,似乎不支持经典的自动加载。我个人会寻找另一个更新的库,但是您可以使用 composer.json 文件功能加载必要的包含文件。此时您可以干净地创建密钥数据包类。就我的测试而言。

# create a new project
symfony new --full pgp
cd pgp
composer require singpolyma/openpgp-php

# Edit composer.json
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        },"files": [
            "vendor/singpolyma/openpgp-php/lib/openpgp.php","vendor/singpolyma/openpgp-php/lib/openpgp_crypt_rsa.php"
        ]
    },# refresh autoload.php
composer dump-autoload

# Add a test command
namespace App\Command;

use phpseclib\Crypt\RSA;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class PgpCommand extends Command
{
    protected static $defaultName = 'pgp:test';

    protected function execute(InputInterface $input,OutputInterface $output)
    {

        $rsa = new RSA();
        $k = $rsa->createKey(512);
        $rsa->loadKey($k['privatekey']);

        // Note the leading back slash
        $nkey = new \OpenPGP_SecretKeyPacket(array(
            'n' => $rsa->modulus->toBytes(),'e' => $rsa->publicExponent->toBytes(),'d' => $rsa->exponent->toBytes(),'p' => $rsa->primes[2]->toBytes(),'q' => $rsa->primes[1]->toBytes(),'u' => $rsa->coefficients[2]->toBytes()
        ));
        return Command::SUCCESS;
    }
}

# and test
bin/console pgp:test

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?