在Symfony2(v2.3.4)中 - FOSUserBundle与CRUD生成的Controller Route冲突

时间:2013-09-02 20:10:23

标签: symfony routes crud fosuserbundle

首先我还在学习所以不要因为我提出这个问题而生气(对我的英语 - 我尽我所能)。

我正在阅读为Symfony 2.0.10编写的书籍教程,但是对于每个练习我正在使用最新的Symfony 2.3.4项目,最终解决了变化(以这种方式学习)并获得了良好的结果但最终我是卡住。

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

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

/**
 * Mountain controller.
 * 
 * @Route("/mountain")
 */
class MountainController extends Controller
{
...

但教程命令删除此注释,以便简单地使用Project / web / address而不是Project / web / mountain。所以我做了。

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

routing.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 }

接下来的步骤是将logout链接添加到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_show”)注释有关,因为“login_path”来自security.yml是“/ login”适合showAction的@Route模式。因此,操作而不是获取要显示的记录的ID(应该是一个数字),接收文本或我不知道是什么,并尝试查找具有否定结果的id。

聚苯乙烯。教程(在Symfony 2.0.10上)的示例正常工作,因为CRUD生成的“showAction”具有路由:@Route("/{id}/show", name="mountain_show") 这不是冲突。

所以,如果有人可以帮助我,我将非常感激。

如果有更多信息,我可以给出更好的解释我的问题,只是说。问候。 KB

1 个答案:

答案 0 :(得分:0)

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

只需在您的配置中移动FOSUserBundle的路径之前您的其他控制器路由即可解决此问题。