0

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

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

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

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

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

但是教程命令删除此注释,以便仅使用 Project/web/ 地址而不是 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 修改为如下所示:

安全.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_show")注释有关,因为来自 security.yml 的 "login_path" 是 "/login" 适合到 showAction 的 @Route 模式。因此,该操作不是让记录的 id 显示(应该是一个数字),而是接收一个文本或者我不知道是什么,并尝试找到具有否定结果的 id。

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

因此,如果有人可以帮助我,我将不胜感激。

如果我可以提供更多信息来更好地解释我的问题,请说。问候。知识库

4

1 回答 1

1

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

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

于 2013-09-02T21:47:31.493 回答