未检测到第三方(供应商)Symfony Bundle 中的命令。怎么了?
Posted
技术标签:
【中文标题】未检测到第三方(供应商)Symfony Bundle 中的命令。怎么了?【英文标题】:Command in third-party (vendor) Symfony Bundle is not detected. What is wrong? 【发布时间】:2019-03-29 21:15:45 【问题描述】:按照https://github.com/glennthehuman/encryption-bundle/blob/master/Resources/doc/index.md的指示
我执行了:php bin/console jagilpe:encryption:user:generate_keys
但我得到了:
“jagilpe:encryption:user”命名空间中没有定义命令。
所以,我检查了这个folder structure 附上代码:
<?php
namespace Jagilpe\EncryptionBundle\Command;
use Doctrine\Common\Util\ClassUtils;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Jagilpe\EncryptionBundle\Entity\PKEncryptionEnabledUserInterface;
use Symfony\Component\Console\Helper\ProgressBar;
class CreateUserKeysCommand extends ContainerAwareCommand
protected function configure()
$this->setName('jagilpe:encryption:user:generate_keys')
->setDescription('Generates the encryption keys of a user')
->addArgument(
'usename',
InputArgument::OPTIONAL,
'The name of the user whose keys we want to create.'
)
->addOption(
'all',
null,
InputOption::VALUE_NONE,
'If the keys of all users should be generated.'
)
;
protected function execute(InputInterface $input, OutputInterface $output)
// Input parameters
$userName = $input->getArgument('usename');
$allUsers = $input->getOption('all');
if (!$userName && !$allUsers)
throw new \RuntimeException('Wrong parameters given');
if ($userName && $allUsers)
throw new \RuntimeException('Ambiguous parameters given');
$users = $this->getUsers($userName);
$total = count($users);
$message = "Generating the encryption keys for $total users";
$output->writeln($message);
$progress = new ProgressBar($output, $total);
foreach ($users as $user)
$this->generateKeys($user);
$this->saveUser($user);
$progress->advance();
$progress->finish();
$output->writeln('');
private function getUsers($userName)
$container = $this->getContainer();
$entityManager = $container->get('doctrine')->getManager();
$encryptionSettings = $container->getParameter('jagilpe_encryption.settings');
$userClasses = $encryptionSettings['user_classes'];
$users = array();
foreach ($userClasses as $userClass)
$userRepo = $entityManager->getRepository($userClass);
if ($userName)
$user = $userRepo->findOneBy(array('username' => $userName));
$users = array($user);
break;
else
$users = array_merge($users, $userRepo->findAll());
return $users;
private function generateKeys(PKEncryptionEnabledUserInterface $user)
if (!$user->getPublicKey() || !$user->getPrivateKey())
$container = $this->getContainer();
$keyManager = $container->get('jagilpe_encryption.key_manager');
$keyManager->generateUserPKIKeys($user);
private function saveUser(PKEncryptionEnabledUserInterface $user)
$userClass = ClassUtils::getClass($user);
$userRepo = $this->getContainer()->get('doctrine')->getManager()->getRepository($userClass);
$userRepo->save($user);
这是怎么回事?
顺便说一句,我能够毫无问题地安装捆绑包。可以在我自己的代码中正确访问和使用源代码。 我只是无法正确运行上述命令。 我还在自己的 Command 目录中创建了自己的命令,并且它们被正确检测和执行。
【问题讨论】:
您是否在内核中启用了 Bundle? github.com/glennthehuman/encryption-bundle#enable-the-bundle 是的。捆绑包的所有功能都可以正常工作,除了这部分。 你使用哪个 Symfony 版本? 我正在使用 Symfony4 【参考方案1】:这一概念帮助我从 symfony 4.* 中的 3rd 方供应商那里获得了工作命令。
只需在您的 services.yaml 文件中注册所需的命令,您就可以开始了。
Jagilpe\EncryptionBundle\Command\CreateUserKeysCommand:
tags:
- name: 'console.command', command: 'jagilpe:encryption:user:generate_keys'
【讨论】:
这个services.yaml
文件在哪里?在第三方供应商包内?以上是关于未检测到第三方(供应商)Symfony Bundle 中的命令。怎么了?的主要内容,如果未能解决你的问题,请参考以下文章
(Symfony 4)如何手动将供应商类添加到容器中,然后注入存储库/服务类?
在 Laravel Homestead 环境中获取 symfony 项目的供应商文件夹时出现问题
Symfony services.yaml来自供应商捆绑包的绑定参数