在 Symfony 框架中使用 openpgp-php 尝试从命名空间 "App\Controller" 加载 class "OpenPGP_SecretKeyPacket"
Using openpgp-php with the Symfony framework Attempted to load class "OpenPGP_SecretKeyPacket" from namespace "App\Controller"
我找到了这个答案,它帮了我一半的忙:
How do you use the PHP OpenPGP library?
首先,由于依赖性,我真的无法通过下载它来正确设置它。但是因为我有 Symfony 运行 并安装了 composer,所以我最终通过 运行 composer require singpolyma/openpgp-php
在 Symfony 中安装了 pgp(但不工作),它将它和依赖项安装到 vendor 文件夹中。
如果我要求如下,我可以在独立的 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",
但是减号不是名称空间中的有效名称。
我通常会得到错误
Attempted to load class "OpenPGP_SecretKeyPacket" from namespace "App\Controller".
Did you forget a "use" statement for another namespace?
<?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 中的命名空间,而且我知道我还没有真正理解 symfony 中发生了什么。我非常感谢 Symfony 中对名称空间的任何提示。
这里其实涉及到两个库。 phpseclib 是命名空间的,因此像 RSA class 这样的东西可以与简单的 new RSA() 一起使用。然而,OpenPGP 的东西没有命名空间,似乎不支持 classic 自动加载。我个人会寻找另一个更新的库,但是您可以使用 composer.json 文件功能来加载必要的包含文件。此时您可以干净地创建密钥数据包 class。这是我进行测试的最大程度。
# 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
我找到了这个答案,它帮了我一半的忙: How do you use the PHP OpenPGP library?
首先,由于依赖性,我真的无法通过下载它来正确设置它。但是因为我有 Symfony 运行 并安装了 composer,所以我最终通过 运行 composer require singpolyma/openpgp-php
在 Symfony 中安装了 pgp(但不工作),它将它和依赖项安装到 vendor 文件夹中。
如果我要求如下,我可以在独立的 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",
但是减号不是名称空间中的有效名称。
我通常会得到错误
Attempted to load class "OpenPGP_SecretKeyPacket" from namespace "App\Controller". Did you forget a "use" statement for another namespace?
<?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 中的命名空间,而且我知道我还没有真正理解 symfony 中发生了什么。我非常感谢 Symfony 中对名称空间的任何提示。
这里其实涉及到两个库。 phpseclib 是命名空间的,因此像 RSA class 这样的东西可以与简单的 new RSA() 一起使用。然而,OpenPGP 的东西没有命名空间,似乎不支持 classic 自动加载。我个人会寻找另一个更新的库,但是您可以使用 composer.json 文件功能来加载必要的包含文件。此时您可以干净地创建密钥数据包 class。这是我进行测试的最大程度。
# 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