对我来说,唯一可能的方法是
1 - 覆盖 FOSUserBundle 的 cli 命令放入 Command/CreateUserCommand.php
2 - 覆盖FOSUserBundle的用户创建方法放入Util/UserManipulator.php
// 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));
}
和
// Util/UserManipulator.php
public function create($username, $password, $email, $latitude, $active, $superadmin)
{
$user = $this->userManager->createUser();
$user->setUsername($username);
$user->setEmail($email);
$user->setPlainPassword($password);
$user->setEnabled((Boolean) $active);
$user->setSuperAdmin((Boolean) $superadmin);
$user->setLatitude($latitude);
$this->userManager->updateUser($user);
return $user;
}
当然,当我说覆盖时,我的意思是...覆盖:P 所以你不必修改 FOSUserBundle 原始文件(你知道,这很危险,原因有很多),而是通过让你的包扩展来制作你自己的文件FOSUserBundle
您想知道如何通过 FOSUserBundle 扩展您的捆绑包吗?
进入你的包“主文件” - 是你用来注册你的包的那个 - 只需添加这行
public function getParent()
{
return 'FOSUserBundle';
}
然后你只需重新创建你的 ovverride 文件所在的树结构到原始包中,到你的自定义包的 Resources/ 目录(相同的位置,相同的文件名,相同的注释,如果有的话)和....魔法可以start :)(仅对view有效,请注意!)
“覆盖”是什么意思?
Override 意味着您采用现有函数,通过在其他地方重新定义来“隐藏”它(声明一个具有相同名称的函数,无论它接受多少参数,无论参数类型如何,因为 php 不支持方法重载[除非你做了一些“破解”])然后你可以使用它而不是原来的。这是向函数添加额外功能或更改函数本身的常用技术。
假设我们有两个类 A 和 B,其中 B 是 A 的子类。还假设 A 有一个名为 myMethod() 的方法。
在 B 中我们可以做类似的事情
public function myMethod() {
parent::myMethod();
//add extra functionalities here
}
通过这种方式,我们在调用父(“原始”)方法时添加额外的功能,然后执行一些额外的功能
如果在 B 中我们制作类似的东西
公共函数 myMethod() {
//这里有一些代码,但没有调用父方法
}
我们正在重新定义 myMethod() 的行为
Symfony2 如何让我覆盖方法?
正如我之前在回答中所说,您必须使您的包成为包含您尝试覆盖的函数的包的子包(在这种情况下为FOSUserBundle)。一旦你这样做了,使用你的包的Resources目录来完成你需要的。复制原始包的“树文件夹结构”(即:文件夹的相同名称)直到你到达包含你需要重写的函数的类。
按照您的实际示例:您需要覆盖 Command/CreateUserCommand.php 中包含的 execute() 函数。您必须在您的捆绑文件夹中创建该路径:
PathTo/YourCostumBundle/Command/
并将上面我向您展示的内容放入文件CreateUserCommand.php。
如果您不明白我在哪里找到该路径,请查看FOSUserBundle 代码,它绝对清楚!
为什么直接修改 FOSUserBundle 代码很危险?
好吧,我可以向您展示一个批评点的很多答案。选择主要的(不按重要性排序):
- 如果您需要更新 FOSUserBundle 怎么办?您将使用 composer 并丢失您对 FOSUserBundle 代码所做的所有修改
- 如果您的项目中有多个捆绑包需要使用 FOSUserBundle,该怎么办?也许自定义行为对一个捆绑包有意义,但对另一个捆绑包没有意义。在本地捆绑包级别定制行为有助于您保持 FOSUserBundle 逻辑完整
- 如果您正在开发一个想要与其他用户共享的捆绑包怎么办?您需要强制他们“采用”您自己定制的 FOSUserBundle 版本,并警告他们不要更新它
最后:我完全知道您的实体没有进入 FOSUserBundle,但我敢打赌他们扩展了 FOSUserBundle 基本用户,所以我上面所说的适用于您的情况。
希望现在不那么模糊了 :)
文档:http://symfony.com/doc/current/cookbook/bundles/inheritance.html#overriding-controllers