Forms Symfony2创建一个Post调用ShowAction
我正在将我的旧网站代码“移植”到新的Symfony2.6中。我有一个控制器来呈现一个表单,并像在博客中一样创建帖子。然后,一旦它有效,就在第二个控制器中提交(POST方法)。当我调用路由初始化控制器时,出于某种原因,我忽略了它,它也调用ShowAction($slug),它失败了,因为post尚未创建,因此它没有任何$slug参数。为什么要称之为表演?尽管我键入url只是为了显示表单 以下是启动故障的行的错误日志:Forms Symfony2创建一个Post调用ShowAction,forms,symfony,redirect,controller,render,Forms,Symfony,Redirect,Controller,Render,我正在将我的旧网站代码“移植”到新的Symfony2.6中。我有一个控制器来呈现一个表单,并像在博客中一样创建帖子。然后,一旦它有效,就在第二个控制器中提交(POST方法)。当我调用路由初始化控制器时,出于某种原因,我忽略了它,它也调用ShowAction($slug),它失败了,因为post尚未创建,因此它没有任何$slug参数。为什么要称之为表演?尽管我键入url只是为了显示表单 以下是启动故障的行的错误日志: 1. in src/Blog/BlogBundle/Services/PostM
1. in src/Blog/BlogBundle/Services/PostManager.php at line 80
2. at PostManager ->findBySlug ('create_post') in src/Blog/BlogBundle/Controller PostController.php at line 55
3. at PostController ->ShowAction ('create_post')
4. at call_user_func_array (array(object(PostController), 'ShowAction'), array('create_post')) in app/bootstrap.php.cache at line 3020
我不想称之为炫耀
以下是控制器代码:
/**
* Show a Post
*
* @param string $slug
*
* @throws NotFoundHttpException
* @return array
*
* @Route("/{slug}")
* @Template()
*/
public function ShowAction($slug)
{
$post = $this->getPostManager()->findBySlug($slug);
$form_comment = $this->createForm(new CommentType());
return array(
'post' => $post,
'form_comment' => $form_comment->createView()
);
}
/**
* Displays a form to create a new Post entity.
*
* @Route("/new_post", name="_blog_backend_post_new")
* @Template()
*/
public function newAction()
{
$form = $this->createForm(new PostType(), new PostModel(new Post()));
return array(
'form' => $form->createView(),
);
}
/**
* Creates a new Post entity.
*
* @Route("/create_post", name="_blog_backend_post_create")
* @Method("POST")
* @Template("BlogBundle:Backend/Post:new.html.twig")
*/
public function createAction()
{
$request = $this->getRequest();
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new PostType(), new PostModel(new Post()));
$formHandler = new PostHandler($form, $request, new Post(), $em);
if ($formHandler->process()) {
return $this->redirect($this->generateUrl('_blog_backend_post'));
}
return array(
'form' => $form->createView(),
);
}
我不知道是否有必要,但这里有相关的模板:*@Template(“BlogBundle:Backend/Post:new.html.twig”):
{%extends”::base.html.twig“%}
{%block content%}
{%include'BlogBundle:Backend/Post:edit.form.html.twig'和{'form':form}%}
{%endblock%}
BlogBundle:Backend/Post:edit.form.html.twig:
{% extends "::base.html.twig" %}
{% block content %}
<form class="well" action="{{ url('_blog_backend_post_create') }}" method="post" {{ form_enctype(form) }}>
{% include 'BlogBundle:Backend/Post:edit.form.html.twig' with {'form': form } %}
</form>
{% endblock %}
{% if form_errors(form) %}
<div class="alert alert-block alert-error fade in form-errors">
{{ form_errors(form) }}
</div>
{% endif %}
<p>
<label for="">Title</label>
{% if form_errors(form.title) %}
<div class="alert alert-block alert-error fade in form-errors">
{{ form_errors(form.title) }}
</div>
{% endif %}
{{ form_widget(form.title, { 'attr': {'class': 'w100'} }) }}
</p>
<p>
<label for="">Body</label>
{% if form_errors(form.body) %}
<div class="alert alert-block alert-error fade in form-errors">
{{ form_errors(form.body) }}
</div>
{% endif %}
{{ form_widget(form.body, { 'attr': {'class': 'w100'} }) }}
</p>
<p>
<button class="btn" type="submit">Save</button>
<a class="btn" href="{{ url('_blog_backend_post') }}">Cancel</a>
</p>
{{ form_rest(form) }}
{%if表单_错误(表单)%}
{{form_errors(form)}}
{%endif%}
标题
{%if表单_错误(form.title)%}
{{form_errors(form.title)}}
{%endif%}
{{form_小部件(form.title,{'attr':{'class':'w100'}}}}
身体
{%if表单_错误(form.body)%}
{{form_errors(form.body)}}
{%endif%}
{{form_小部件(form.body,{'attr':{'class':'w100'}}}}
拯救
{{form_rest(form)}
我遗漏了什么,如何纠正?高级版谢谢。问题是您正在发布到/create_post,而该post又与路径/{slug}匹配。slug被设置为“创建帖子”。使用Symfony 2路由器,第一场比赛获胜,因此将调用showAction方法 考虑将ShowAction路径设置为:'/show/{slug}'
或者你也可以将你的决战移动到你的控制器文件的底部。这有点危险,因为您可能会忘记并在以后添加不同的操作。但是任何一种方法都可以。路由器匹配第一条可能的路由,在本例中为“{slug}”,其中slug=“create_post” 至少有两种解决方案,第一种是最简单的,第二种是我推荐的:
- 将您的showAction剪切/粘贴到文件底部,在这种情况下,路由器将首先匹配/创建发布到createAction
- 您可以这样排除它:
@Route(“/{slug}”),requirements={“slug=”^(?为什么不在新建/编辑表单时使用相同的函数,并在提交后处理它?我想对其进行改进,而旧的函数在这种情况下并不有用。但是我现在使用的函数非常相同,因此我认为问题在于首先调用showAction的控制器,而不仅仅是NewAction创建一个处理bot的路由h新建和编辑操作。如果“$slug”为空,则创建新对象,否则更新当前对象错误显示/create_post是问题所在。那么为什么/new_post看起来可以工作呢?这是因为我先读到:“尽管我键入url只是为了显示表单。”,这就是“new_post”“。但是,谢谢,我更改了它。如果用户键入/new_post,你认为会发生什么?谢谢你的帮助。我知道slug干扰了新操作。我添加了新要求,现在它工作了。但是在以前的symfony版本中它工作起来很奇怪。谢谢!