【问题标题】:Symfony : Issue with routingSymfony:路由问题
【发布时间】:2017-09-10 18:20:58
【问题描述】:

我是 Symfony 的新手,我学习了一个教程,关于安全和用户管理的部分,但我遇到了一个似乎来自我的路由的问题。

我刚刚创建了一个实际工作的登录表单,当我继续/app_dev.php/login 时,表单出现了,我可以填写它,但是当我提交它时,出现以下错误:

No route found for "GET /" (from "http://dev-05/ANTOINE/Symfony/web/app_dev.php/login")
404 Not Found - NotFoundHttpException
1 linked Exception:
ResourceNotFoundException » 

收到此错误后,如果我回到主页,我可以看到我已连接,所以它正在工作,但重定向不是。

根据文档,这是来自可能配置错误的路由,但我不知道我在哪里出错。

这是我的表单、security.yml 和 routing.yml 文件:

{% extends "AKMUserBundle::layout.html.twig" %}

{% block akmuser_body %}

{% if error %}
    <div class="alert alert-danger">{{ error.message }}</div>
{% endif %}

<form action="{{ path('login_check') }}" method="post">
    <label for="username">Login : </label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Mot de passe :</label>
    <input type="password" id="password" name="_password" />
    <br />
    <input type="submit" value="Connexion" />
</form>

{% endblock %}

security.yml:

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        in_memory:
            memory: 
                users:
                    user: { password: userpass, roles: ['ROLE_USER'] }
                    admin: { password: adminpass, roles: ['ROLE_ADMIN'] }

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            anonymous: true
            form_login:
                login_path: login
                check_path: login_check
            logout:
                path: logout
                target: /platform

routing.yml :

akm_platform:
resource: "@AKMPlatformBundle/Resources/config/routing.yml"
prefix:   /platform

login:
    path: /login
    defaults:
        _controller: AKMUserBundle:Security:login

login_check:
    path: /login_check

logout:
    path: /logout

我知道.yml 文件非常敏感,需要 4 个空格而不是通常的缩进,所以我用空格逐行重写了文件,但它仍然无法正常工作。

我希望有人可以帮助我:p 如果您需要一些信息,请不要犹豫!

编辑:这是php bin/console debug:router 的结果

编辑 2:为了摆脱我的问题,我只需要在我的 security.yml 中添加 default_target_path :

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        in_memory:
            memory: 
                users:
                    user: { password: userpass, roles: ['ROLE_USER'] }
                    admin: { password: adminpass, roles: ['ROLE_ADMIN'] }

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            anonymous: true
            form_login:
                login_path: login
                check_path: login_check
                default_target_path: akm_platform_home
            logout:
                path: logout
                target: /platform

【问题讨论】:

  • 在您的浏览器中查看您的登录表单的来源并验证方法是 POST 并且操作是 /login_check。错误信息暗示你有GET /(离题:yaml不需要4个空格,只要保持一致即可)。
  • 第一个是创建一个指向您项目的 /web 目录的虚拟主机。 / 路线有效吗? dev-05/ANTOINE/Symfony/web/app_dev.php
  • 我编辑了我的帖子,所以你可以看到我的表格,这对我来说似乎没问题。关于路线,如果我尝试转到 /web/app_dev.php 它不起作用,但最后有一个“/”它工作正常,你认为问题来自这里吗?

标签: symfony routing symfony-routing symfony-3.2


【解决方案1】:

刷新你的缓存,控制台命令:php bin/console cache:clear,如果你使用的是旧的 symfony,它是 app/console 而不是 bin/console。您可以使用以下命令调试路由:php bin/console debug:router。这是主系统控制台,就我而言,我在 Windows 上使用它。您必须在项目文件夹中才能使它们工作。

我不确定你在哪里被重定向到“/”,我最近开始在 Symfony 中工作,大多数问题是刷新缓存和错误的 yml 和路由名称。但是,在您的情况下,symfony 可能会在成功登录时路由 /,您可以添加 default_target_path: your_homepage_route_name or /where_you_want_to_go 这可能是这里的问题。

由于您是新手,当您包含路由并为它们定义前缀时,您很容易忘记您设置了它,这就是为什么路由器调试很棒,因为您可以很容易地看到那里的所有信息。在 symfony 中工作时,如果不在带有内置控制台的编辑器中工作,则始终打开一个控制台窗口。我认为 JetBeans 有它,所有这些教程都是在其中完成的。 PS,symfony 的 youtube 教程很棒,例如 Symfony 和 PHP 编程频道有一个很好的初学者教程。

【讨论】:

  • 我已经刷新了缓存,我又做了一次,以防万一,没有改变任何东西。我在原帖中添加了php bin/console debug:router的结果,在我看来,一切正常
  • 嗯,很有趣。您是否尝试过设置默认目标路径,我用它的信息编辑了我的帖子,另外,不要忘记保存您在编辑器中所做的任何更改,我以前一直在这条路上:)
  • 好的,我阅读了 symfony link 文档,看来您总是在成功登录后被重定向,因为您没有定义默认目标路径,它试图将您重定向到请求的路由这是 /login ,因为你已经在那里它可能试图去 / 这是在骨架应用程序本身定义的,但你可能改变它或删除了默认的 AppBundle 控制器。
  • 谢谢,就是这样,我刚刚在我的 form_login (security.yml) 中添加了 default_target_path,它工作得很好! :D
  • 啊,太好了,很高兴我能帮上忙。查看有关 symfony 的 youtube 教程,它们可以提供很多帮助,并且不要忘记必须单独清除生产环境缓存。我切换到 prod 并在一个愚蠢的“hello world”页面上浪费了几个小时,我把头撞在桌子上,思考出了什么问题。此外,如果validation.yml 中存在错误,您很快就会了解它,当您刷新缓存时,您也可以看到这些错误,有时,有时,它需要好老头在桌子上敲打。我讨厌调试 YML
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2011-09-12
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多