首先,我还在学习,所以不要因为我问这个问题而生我的气(为了我的英语——我正在尽力而为)。
我正在阅读为 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")
这不是冲突。
因此,如果有人可以帮助我,我将不胜感激。
如果我可以提供更多信息来更好地解释我的问题,请说。问候。知识库