在Symfony2(v2.3.4)中-FOSUserBundle与CRUD生成的控制器路由冲突
首先,我还在学习,所以不要因为我问这个问题而生气(为了我的英语,我已经尽力了) 我正在学习为Symfony 2.0.10编写的书籍教程,但对于每个练习,我都使用最新的Symfony 2.3.4项目,解决了最终的变化(以这种方式学习),并取得了很好的效果,但最后我陷入了困境 问题是,练习的重点是使用FOSUserBundle和CRUD面板“制作一个仅可供登录用户访问的应用程序”。(没有注册和所有不必要的东西) 就像在教程中一样,我创建了一个bundle(My/BackendBundle),删除了它的控制器和视图,然后创建了一个名为MyBackendBundle:Mountain的实体,并用我的数据填充数据库。接下来,我为我之前创建的实体创建了CRUD面板,因此新控制器将显示所有这些“显示”、“新建”、“编辑”等方法。重要的是生成的控制器类(由于“MyBackendBundle:Mountain”实体而命名为MountainController)在类之前有@Routing注释:在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),删除了它
/**
* 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”)
这不是冲突
因此,如果有人能帮我,我将不胜感激
如果有任何更多的信息,我可以给更好地解释我的问题,只要说。当做KBsymfony的路由将尝试匹配找到的第一个匹配路由。。。在您的情况下,其他控制器的注释路由配置在FOSUserBundle的注释路由之前/之上。。。因此,symfony将首先尝试匹配
/{id}
,然后尝试匹配/login
只需在配置中将FOSUserBundle的路由移动到另一个控制器的路由之前,即可解决此问题。谢谢您的回答,你说得对。我知道路线的顺序很重要,但我认为这只涉及security.yml的“访问控制”部分。我在routing.yml中做了更改,现在“我的后端”在“fos\u用户安全”之后。现在登录屏幕出现,但不幸的是,在我登录后,我得到了“拒绝访问”异常。呵呵