Symfony 使用FosUserBundle创建管理员用户

Symfony 使用FosUserBundle创建管理员用户,symfony,cmd,admin,fosuserbundle,Symfony,Cmd,Admin,Fosuserbundle,我尝试使用以下命令从命令窗口创建具有FOsUserBundle的管理员用户: php app/console fos:user:create 在我的项目中,管理员用户以强制的方式扩展其他用户。因此,当我选择用户名、邮件和密码时,它会告诉我: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'latitude' cannot be null 如何在AdminUser中设置“纬度”值?我也使用PUGXMultiUserBu

我尝试使用以下命令从命令窗口创建具有FOsUserBundle的管理员用户:

php app/console fos:user:create
在我的项目中,管理员用户以强制的方式扩展其他用户。因此,当我选择用户名、邮件和密码时,它会告诉我:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'latitude' cannot be null

如何在AdminUser中设置“纬度”值?我也使用PUGXMultiUserBundle。

唯一可能的方法是

1-覆盖放置在
命令/CreateUserCommand.php中的
FOSUserBundle
的cli命令 2-覆盖放置在
Util/UserManipulator.php中的
FOSUserBundle
的用户创建方法

// Command/CreateUserCommand.php
protected function execute(InputInterface $input, OutputInterface $output)
{
  $username   = $input->getArgument('username');
  $email      = $input->getArgument('email');
  $password   = $input->getArgument('password');
  $inactive   = $input->getOption('inactive');
  $superadmin = $input->getOption('super-admin');
  $latitude   = $input->getOption('latitude'); //this will be your own logic add

  $manipulator = $this->getContainer()->get('fos_user.util.user_manipulator');
  $manipulator->create($username, $password, $email, $latitude, !$inactive, $superadmin);

  $output->writeln(sprintf('Created user <comment>%s</comment>', $username));
}
当然,当我说覆盖时,我的意思是。。。override:P因此您不必修改原始文件(您知道,这有很多原因,是危险的),而是通过将包扩展为
FOSUserBundle

您是否想知道如何通过FOSUserBundle扩展您的包? 在您的捆绑包“mainfile”中—是您用来注册捆绑包的文件—只需添加以下行

public function getParent()
{
  return 'FOSUserBundle';
}
然后,您只需将ovverride文件所在的树结构重新创建到原始捆绑包、自定义捆绑包的资源/目录(相同的位置、相同的文件名、相同的注释,如果有的话)和。。。。魔术可以开始:)(这只对视图有效,请注意!)

“覆盖”是什么意思? Override意味着您通过在其他地方重新定义(声明一个具有相同名称的函数,不管它接受多少个参数,不管参数的类型如何,因为php不支持方法重载[除非您进行了一些“hack”]),然后您可以使用它来代替原始函数。这是向函数添加额外功能或更改函数本身的常用技术。
假设我们有两个类,A和B,其中B是A的子类。还假设A有一个名为
myMethod()
的方法

在B中,我们可以做类似的事情

public function myMethod() {
  parent::myMethod();
  //add extra functionalities here
}
通过这种方式,我们在调用父(“原始”)方法时添加了额外的功能,然后执行一些额外的功能

而如果在B中,我们做的是

public function myMethod() {
  parent::myMethod();
  //add extra functionalities here
}
公共函数myMethod(){ //这里有一些代码,但不调用父方法 }

我们正在重新定义
myMethod()

Symfony2如何让我覆盖方法? 正如我在前面的回答中所说,您必须使您的包成为包含您试图覆盖的函数的包的子包(在这种情况下,
FOSUserBundle
)。完成后,使用bundle的
Resources
目录完成所需的工作。复制原始捆绑包的“树文件夹结构”(即文件夹的相同名称),直到到达包含需要重写的函数的类为止

按照您的实际示例:您需要重写
Command/CreateUserCommand.php
中包含的
execute()
函数。您必须在bundle文件夹中创建以下路径:

PathTo/YourCostumBundle/Command/
然后将文件
CreateUserCommand.php
与我上面展示的内容放在一起

如果您不明白我在哪里找到该路径,请查看
FOSUserBundle
code,它将非常清晰

为什么直接修改FOSUserBundle代码是危险的? 好吧,我可以告诉你很多关于批评的答案。选择干管(不按重要性排序):

  • 如果您需要更新FOSUserBundle怎么办?您将使用composer并丢失对FOSUserBundle代码所做的所有修改
  • 如果项目中有多个bundle需要使用FOSUserBundle,该怎么办?也许定制行为对一个包有意义,但对另一个包没有意义。在本地bundle级别对行为进行成本化有助于保持FOSUserBundle逻辑完好无损
  • 如果您正在开发一个要与其他用户共享的捆绑包,该怎么办?您需要强制他们“接受”您自己的付费FOSUserBundle版本,并警告他们更新该版本
最后:我完全知道您的实体不属于FOSUserBundle,但我敢打赌他们扩展了FOSUserBundle基本用户,所以我上面所说的适用于您的情况

希望现在不那么模糊:)



文档:

我始终遵循在symfony文档中学习到的模式:

php bin/console fos:user:create usertest mail@domain.com password
有时我需要更改表“fos_user”上的“角色”

然后


您是否尝试过在声明中将属性设置为默认值?类似于“private$latitude=0”。当然这不是最优的,因为它不是一个真正有用的默认值。但是我想如果您想使用fos:user:create命令,除了设置默认值之外,您没有其他选择。如果这不是您想要的,我想您必须创建自己的用户创建命令,这应该不会太难。@Leif我会避免使用默认值。如何创建“我的用户创建”命令?我在哪里可以找到文档?非常感谢您的帮助。我对Symfony和php非常陌生,所以当你说“override”时我不太理解。为什么要修改FOSUserBundle?问题是:我应该改变什么?现在我使用FosUserBundle和PUGXMultiUserBundle,我的用户实体不在FosUserBundle中,但在UserBundle中,它由两种不同类型的实体(如user1和user2)扩展。嗨!我还有一个疑问。我按照你告诉我的做了(我创建了一个Acme\MainBundle\Resources\FOSUserBundle\Command\CreateUserCommand.php和一个Acme\MainBundle\Resources\FOSUserBundle\Util\UserManipulator.php文件,并将父声明放入\Acme\MainBundle\AcmeMainBundle.php)。我清除了缓存,但是cmd命令仍然没有向我询问纬度。我哪里会出错?我从MainBundle调用命令而不是直接从FOSUserBundle调用命令的cmd怎么可能呢
a:0:{}
a:1:{i:0;s:10:"ROLE_ADMIN";}