php – 覆盖symfony2控制台命令?
发布时间:2020-12-13 14:15:36 所属栏目:PHP教程 来源:网络整理
导读:是否可以覆盖symfony2 app / console命令?例如,在FOS UserBundle中,我想添加更多的字段,它会在使用其控制台创建用户命令创建用户时询问.这是可能的,还是需要在自己的捆绑包中创建自己的控制台命令? 为命令添加更多字段的整个过程是: 1.在AcmeDemoBundle类
是否可以覆盖symfony2 app / console命令?例如,在FOS UserBundle中,我想添加更多的字段,它会在使用其控制台创建用户命令创建用户时询问.这是可能的,还是需要在自己的捆绑包中创建自己的控制台命令?
为命令添加更多字段的整个过程是:
1.在AcmeDemoBundle类中,您必须将FOSUser设置为父级: <?php namespace AcmeUserBundle; use SymfonyComponentHttpKernelBundleBundle; use SymfonyComponentDependencyInjectionContainerBuilder; class AcmeUserBundle extends Bundle { public function getParent() { return 'FOSUserBundle'; } } 2.一旦你这样做,你可以重新创建你的捆绑包中的CreateUserCommand: <?php namespace AcmeUserBundleCommand; use SymfonyBundleFrameworkBundleCommandContainerAwareCommand; use SymfonyComponentConsoleInputInputArgument; use SymfonyComponentConsoleInputInputOption; use SymfonyComponentConsoleInputInputInterface; use SymfonyComponentConsoleOutputOutputInterface; use FOSUserBundleModelUser; /** * @author Matthieu Bontemps <matthieu@knplabs.com> * @author Thibault Duplessis <thibault.duplessis@gmail.com> * @author Luis Cordova <cordoval@gmail.com> */ class CreateUserCommand extends ContainerAwareCommand { /** * @see Command */ protected function configure() { $this ->setName('fos:user:create') ->setDescription('Create a user.') ->setDefinition(array( new InputArgument('username',InputArgument::REQUIRED,'The username'),new InputArgument('email','The email'),new InputArgument('password','The password'),new InputArgument('name','The name'),new InputOption('super-admin',null,InputOption::VALUE_NONE,'Set the user as super admin'),new InputOption('inactive','Set the user as inactive'),)) ->setHelp(<<<EOT The <info>fos:user:create</info> command creates a user: <info>php app/console fos:user:create matthieu</info> This interactive shell will ask you for an email and then a password. You can alternatively specify the email and password as the second and third arguments: <info>php app/console fos:user:create matthieu matthieu@example.com mypassword</info> You can create a super admin via the super-admin flag: <info>php app/console fos:user:create admin --super-admin</info> You can create an inactive user (will not be able to log in): <info>php app/console fos:user:create thibault --inactive</info> EOT ); } /** * @see Command */ protected function execute(InputInterface $input,OutputInterface $output) { $username = $input->getArgument('username'); $email = $input->getArgument('email'); $password = $input->getArgument('password'); $name = $input->getArgument('name'); $inactive = $input->getOption('inactive'); $superadmin = $input->getOption('super-admin'); $manipulator = $this->getContainer()->get('acme.util.user_manipulator'); $manipulator->create($username,$password,$email,$name,!$inactive,$superadmin); $output->writeln(sprintf('Created user <comment>%s</comment>',$username)); } /** * @see Command */ protected function interact(InputInterface $input,OutputInterface $output) { if (!$input->getArgument('username')) { $username = $this->getHelper('dialog')->askAndValidate( $output,'Please choose a username:',function($username) { if (empty($username)) { throw new Exception('Username can not be empty'); } return $username; } ); $input->setArgument('username',$username); } if (!$input->getArgument('email')) { $email = $this->getHelper('dialog')->askAndValidate( $output,'Please choose an email:',function($email) { if (empty($email)) { throw new Exception('Email can not be empty'); } return $email; } ); $input->setArgument('email',$email); } if (!$input->getArgument('password')) { $password = $this->getHelper('dialog')->askAndValidate( $output,'Please choose a password:',function($password) { if (empty($password)) { throw new Exception('Password can not be empty'); } return $password; } ); $input->setArgument('password',$password); } if (!$input->getArgument('name')) { $name = $this->getHelper('dialog')->askAndValidate( $output,'Please choose a name:',function($name) { if (empty($name)) { throw new Exception('Name can not be empty'); } return $name; } ); $input->setArgument('name',$name); } } } 注意我添加了一个名为name的新的输入参数,在命令中,我使用的是一个acme.util.user_manipulator服务,而不是原来的一个os,我也要处理用户的名字. 3.创建您自己的UserManipulator: <?php namespace AcmeUserBundleUtil; use FOSUserBundleModelUserManagerInterface; /** * Executes some manipulations on the users * * @author Christophe Coevoet <stof@notk.org> * @author Luis Cordova <cordoval@gmail.com> */ class UserManipulator { /** * User manager * * @var UserManagerInterface */ private $userManager; public function __construct(UserManagerInterface $userManager) { $this->userManager = $userManager; } /** * Creates a user and returns it. * * @param string $username * @param string $password * @param string $email * @param string $name * @param Boolean $active * @param Boolean $superadmin * * @return FOSUserBundleModelUserInterface */ public function create($username,$active,$superadmin) { $user = $this->userManager->createUser(); $user->setUsername($username); $user->setEmail($email); $user->setName($name); $user->setPlainPassword($password); $user->setEnabled((Boolean)$active); $user->setSuperAdmin((Boolean)$superadmin); $this->userManager->updateUser($user); return $user; } } 在这个类中,我只需要create函数,所以其他的命令,如promotion,demote ..不知道你的用户的新属性,所以我不需要创建一个CompilerPass来覆盖整个服务. 4.最后,在Resources / config目录中定义新的UserManipulator服务,并将其添加到DependencyInjection扩展中: services: acme.util.user_manipulator: class: AcmeUserBundleUtilUserManipulator arguments: [@fos_user.user_manager] 完成! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |