首先我还在学习所以不要因为我提出这个问题而生气(对我的英语 - 我尽我所能)。
我正在阅读为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
答案 0 :(得分:0)
symfony的路由将尝试匹配找到的第一个匹配路由...在您的情况下,其他控制器的注释路由在FOSUserBundle之前/之上配置...因此symfony将首先尝试匹配{ {1}}然后/{id}
。
只需在您的配置中移动FOSUserBundle的路径之前您的其他控制器路由即可解决此问题。