在Symfony2(v2.3.4)中-FOSUserBundle与CRUD生成的控制器路由冲突

在Symfony2(v2.3.4)中-FOSUserBundle与CRUD生成的控制器路由冲突,symfony,routes,crud,fosuserbundle,Symfony,Routes,Crud,Fosuserbundle,首先,我还在学习,所以不要因为我问这个问题而生气(为了我的英语,我已经尽力了) 我正在学习为Symfony 2.0.10编写的书籍教程,但对于每个练习,我都使用最新的Symfony 2.3.4项目,解决了最终的变化(以这种方式学习),并取得了很好的效果,但最后我陷入了困境 问题是,练习的重点是使用FOSUserBundle和CRUD面板“制作一个仅可供登录用户访问的应用程序”。(没有注册和所有不必要的东西) 就像在教程中一样,我创建了一个bundle(My/BackendBundle),删除了它

首先,我还在学习,所以不要因为我问这个问题而生气(为了我的英语,我已经尽力了)

我正在学习为Symfony 2.0.10编写的书籍教程,但对于每个练习,我都使用最新的Symfony 2.3.4项目,解决了最终的变化(以这种方式学习),并取得了很好的效果,但最后我陷入了困境

问题是,练习的重点是使用FOSUserBundle和CRUD面板“制作一个仅可供登录用户访问的应用程序”。(没有注册和所有不必要的东西)

就像在教程中一样,我创建了一个bundle(My/BackendBundle),删除了它的控制器和视图,然后创建了一个名为MyBackendBundle:Mountain的实体,并用我的数据填充数据库。接下来,我为我之前创建的实体创建了CRUD面板,因此新控制器将显示所有这些“显示”、“新建”、“编辑”等方法。重要的是生成的控制器类(由于“MyBackendBundle:Mountain”实体而命名为MountainController)在类之前有@Routing注释:

/**
 * Mountain controller.
 * 
 * @Route("/mountain")
 */
class MountainController extends Controller
{
...
但教程要求删除此注释,以便只使用Project/web/address而不是Project/web/mountain。所以我做了

然后我创建了一个管理员帐户,并将我的routing.yml更改为如下所示:

路由.yml

my_backend:
    resource: "@MyBackendBundle/Controller/"
    type:     annotation
    prefix:   /

fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"
tut的下一步是将security.yml修改为如下所示:

security.yml

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    #role_hierarchy:
    #    ROLE_ADMIN:       ROLE_USER
    #    ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username
            #id: fos_user.user_manager

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider

                # the user is redirected here when he/she needs to login
                login_path:                     /login

                # if true, forward the user to the login form instead of redirecting
                use_forward:                    false

                # submit the login form here
                check_path:                     /login_check

                # by default, the login form *must* be a POST, not a GET
                post_only:                      true
                #remember_me:    false

                # login success redirecting options (read further below)
                always_use_default_target_path: false
                default_target_path:            /
                target_path_parameter:          _target_path
                use_referer:                    false

                # login failure redirecting options (read further below)
                failure_path:                   null
                failure_forward:                false

                # field names for the username and password fields
                username_parameter:             _username
                password_parameter:             _password

                # csrf token options
                csrf_parameter:                 _csrf_token
                intention:                      authenticate

            logout:       true
            anonymous:    true

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, role: ROLE_ADMIN }
接下来的步骤是将注销链接添加到base.html.twig并覆盖登录页面,但这可能并不重要,因为问题已经开始。当我尝试运行我的应用程序时,无法找到Mountain实体。异常。它指向MountainController中的此功能:

/**
     * Finds and displays a Mountain entity.
     *
     * @Route("/{id}", name="mountain_show")
     * @Method("GET")
     * @Template()
     */
    public function showAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('MyBackendBundle:Mountain')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Mountain entity.');
        }

        $deleteForm = $this->createDeleteForm($id);

        return array(
            'entity'      => $entity,
            'delete_form' => $deleteForm->createView(),
        );
    }
我几乎可以肯定它与CRUD生成的@Route(“/{id}”,name=“mountain\u show”)注释有关,因为security.yml中的“login\u path”即“/login”符合showAction的@Route模式。因此,该操作不是获取要显示的记录id(应该是一个数字),而是接收一条文本或我不知道是什么,并尝试查找带有否定结果的id

另外,教程中的示例(在Symfony 2.0.10上)之所以有效,是因为CRUD生成的“showAction”具有路径:
@route(“/{id}/show”,name=“mountain_show”)
这不是冲突

因此,如果有人能帮我,我将不胜感激


如果有任何更多的信息,我可以给更好地解释我的问题,只要说。当做KB

symfony的路由将尝试匹配找到的第一个匹配路由。。。在您的情况下,其他控制器的注释路由配置在FOSUserBundle的注释路由之前/之上。。。因此,symfony将首先尝试匹配
/{id}
,然后尝试匹配
/login


只需在配置中将FOSUserBundle的路由移动到另一个控制器的路由之前,即可解决此问题。

谢谢您的回答,你说得对。我知道路线的顺序很重要,但我认为这只涉及security.yml的“访问控制”部分。我在routing.yml中做了更改,现在“我的后端”在“fos\u用户安全”之后。现在登录屏幕出现,但不幸的是,在我登录后,我得到了“拒绝访问”异常。呵呵