Symfony Sonata中无法继承ProfileFOSUser1Controller问题求助
看起来你在尝试覆盖Sonata User Bundle的Profile控制器,但遇到了继承不生效的问题。这种情况通常是因为缺少几个关键配置步骤,而不仅仅是清除缓存。我来一步步帮你排查解决:
1. 确保你的Application Bundle正确继承SonataUserBundle
首先,你的Application\Sonata\UserBundle必须声明为SonataUserBundle的子Bundle,这样Symfony才会优先使用你的控制器而不是Sonata的默认实现。在Application/Sonata/UserBundle/ApplicationSonataUserBundle.php中添加以下代码:
<?php namespace Application\Sonata\UserBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class ApplicationSonataUserBundle extends Bundle { public function getParent() { return 'SonataUserBundle'; } }
2. 覆盖Sonata的Profile路由
Sonata默认使用自己的控制器处理profile相关请求,你需要通过路由配置来覆盖它,让请求指向你的自定义控制器。
在app/config/routing.yml(或者你的Application Bundle的Resources/config/routing.yml)中添加路由覆盖规则:
# 覆盖编辑认证信息的特定路由 sonata_user_profile_edit_authentication: path: /profile/edit-authentication defaults: { _controller: ApplicationSonataUserBundle:ProfileUser:editAuthentication } # 如果需要覆盖整个profile模块的路由,可以导入自定义路由文件 sonata_user_profile: resource: '@ApplicationSonataUserBundle/Resources/config/routing/profile.yml' prefix: /profile
如果选择导入自定义路由文件,创建Application/Sonata/UserBundle/Resources/config/routing/profile.yml并添加所有需要覆盖的profile路由,比如:
sonata_user_profile_show: path: / defaults: { _controller: ApplicationSonataUserBundle:ProfileUser:show } sonata_user_profile_edit: path: /edit defaults: { _controller: ApplicationSonataUserBundle:ProfileUser:edit } sonata_user_profile_edit_authentication: path: /edit-authentication defaults: { _controller: ApplicationSonataUserBundle:ProfileUser:editAuthentication }
3. 修复控制器代码中的缺失依赖
你的控制器代码中使用了UserInterface和AccessDeniedException等类,但没有导入,这会导致运行时错误,可能让你误以为继承不生效。修改后的完整控制器代码如下:
<?php namespace Application\Sonata\UserBundle\Controller; use Sonata\UserBundle\Controller\ProfileFOSUser1Controller as BaseController; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RedirectResponse; /** * Overwrite methods from the ProfileFOSUser1Controller if you want to change the behavior * for the current profile * */ class ProfileUserController extends BaseController { /** * @throws AccessDeniedException * * @return Response|RedirectResponse */ public function editAuthenticationAction() { echo "here"; die; $user = $this->getUser(); if (!is_object($user) || !$user instanceof UserInterface) { throw new AccessDeniedException('This user does not have access to this section.'); } $form = $this->get('sonata.user.authentication.form'); $formHandler = $this->get('sonata.user.authentication.form_handler'); $process = $formHandler->process($user); if ($process) { $this->setFlash('sonata_user_success', 'profile.flash.updated'); return $this->redirect($this->generateUrl('sonata_user_profile_show')); } return $this->render('SonataUserBundle:Profile:edit_authentication.html.twig', [ 'form' => $form->createView(), ]); } }
4. 彻底清除缓存
最后,确保清除所有缓存,包括开发和生产环境:
# 开发环境 php bin/console cache:clear --env=dev # 生产环境(如果适用) php bin/console cache:clear --env=prod
做完这些步骤后,访问/profile/edit-authentication应该就能看到你添加的echo "here"; die;输出了,说明你的自定义控制器已经生效。
内容的提问来源于stack exchange,提问作者Pritika

