我试图了解并使用FOSUserbundle。
我有一个简单的逻辑添加到注册过程,将用户链接到客户。 为此,我创建了一个子包(远远地设置了FOS)。
然后我为控制器提供了以下代码:
class RegistrationController extends BaseController
{
public function RegisterAdminUserAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$customer = new Customer();
$customer = $em->getRepository('MyRepo:Customer')->findOneById(1);
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->container->get('fos_user.registration.form.factory');
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->container->get('fos_user.user_manager');
/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
$dispatcher = $this->container->get('event_dispatcher');
$user = $userManager->createUser();
$user->setEnabled(true);
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
if (null !== $event->getResponse())
{
return $event->getResponse();
}
$form = $formFactory->createForm();
$form->setData($user);
if ('POST' === $request->getMethod())
{
$form->bind($request);
//form received
if ($form->isValid())
{
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
$user->setType("CustomerAdmin");
$user->setCustomer($customer);
$userManager->updateUser($user);
if (null === $response = $event->getResponse())
{
$url = $this->container->get('router')->generate('fos_user_registration_confirmed');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
return $response;
}
}
else
{
return $this->container->get('templating')->renderResponse('NRtworksSubscriptionBundle:RegisterAdmin:registration.html.'.$this->getEngine(), array(
'RegisterAdminForm' => $form->createView(),
));
}
}
}
这只是我从原始控制器粘贴的代码。
我有两个问题:
我对getDoctrine()的调用不起作用,显然是因为控制器没有扩展主类Controller。我的问题是如何在扩展FOS的控制器中访问实体管理器和所有主题函数?
你可以看到控制器的最后一部分: $这个 - >容器 - >获得('模板') - >的renderResponse(' NRtworksSubscriptionBundle:。RegisterAdmin:registration.html' $这个 - > getEngine() ,阵列( ' RegisterAdminForm' => $形式 - > CreateView的(), )); 与原来不同。我不得不自己放一个,否则表格会将我重定向到原来的FOS控制器。这是"对"使用FOS的方法(在twig中修改表单的路径,而不是在PHP中链接它,对我来说似乎很脏)?
答案 0 :(得分:1)
如果您的控制器正在扩展" base"注册控制器来自 FOSUserBundle (例如FOS\UserBundle\Controller\RegistrationController
)然后你有一个ContainerAware
对象,但正如你所指出的那样,不是提供某些便利方法的基本Symfony控制器。
基本控制器的getDoctrine()
方法只是从容器中返回学说服务的便捷方法,例如
public function getDoctrine()
{
if (!$this->container->has('doctrine')) {
throw new \LogicException('The DoctrineBundle is not registered in your application.');
}
return $this->container->get('doctrine');
}
所以回答你的问题:
RegistrationController
添加便捷方法,与上述方法类似,或者只需将$this->getDoctrine()
调用替换为从容器返回doctrine
服务的FOSUserBundle
。作为替代方案,您可以通过将FOSUserBundle
指定为捆绑包的父级来简单地使用您自己的class MyUserBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
进行扩展,因为您可能已经完成了此操作,例如
register.html.twig
执行此操作应该允许您通过将自定义视图(如果您使用twig)放置在与源包中找到的位置相同的位置来简单地覆盖资源。这样,您可以保持行为,而无需修改控制器,同时自定义视图。
当然,如果你需要额外的业务逻辑,或者需要做任何自定义的事情,你可能不得不以任何方式覆盖控制器。
答案 1 :(得分:0)
要回答您的第一个问题 - 您在控制器中有$this->container
,因此,您可以使用Doctrine
访问$doctrine = $this->container->get('doctrine');