Symfony2 创建一个 Post 调用 ShowAction
Symfony2 Create a Post calls ShowAction
我"transplanting"我把我的旧网站代码改成了新的Symfony2.6。我有一个控制器来呈现表单并创建 posts,就像在博客中一样。一旦有效,它就会在第二个控制器中提交(POST 方法)。当我调用路由来初始化控制器时,出于某种原因我忽略了它,它还调用了 ShowAction($slug),但它失败了,因为 post 它尚未创建,因此它没有任何 $slug范围。为什么调用这个 showAction?尽管我输入 url 只是为了显示表格。
这是开始失败的行的错误日志:
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
我不想调用 ShowAction。
控制器代码如下:
/**
* 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 %}
<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 %}
BlogBundle:Backend/Post:edit.form.html.twig:
{% 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) }}
我遗漏了什么,我该如何更正?先谢谢你了。
问题是您要发布到 /create_post,而这又与路由 /{slug} 匹配。 slug 被设置为 'create_post'。使用 Symfony 2 路由器,第一场比赛获胜,因此您的 showAction 方法被调用。
考虑将 ShowAction 路径设置为:“/show/{slug}”。
或者您可以将 ShowAction 向下移动到控制器文件的底部。这有点危险,因为您可能会忘记并稍后添加不同的操作。但无论哪种方式都行得通。
路由器匹配第一个可能的路由,在本例中为“/{slug}”,其中 slug="create_post".
至少有两种解决方案,第一种最简单,第二种是我推荐的:
Cut/Paste 你的 showAction 到你的文件的底部,在这种情况下,路由器将首先匹配 /create_post 到 createAction
您可以像这样排除:@Route("/{slug}", requirements={"slug" = "^(?<!create_post).+"})
我"transplanting"我把我的旧网站代码改成了新的Symfony2.6。我有一个控制器来呈现表单并创建 posts,就像在博客中一样。一旦有效,它就会在第二个控制器中提交(POST 方法)。当我调用路由来初始化控制器时,出于某种原因我忽略了它,它还调用了 ShowAction($slug),但它失败了,因为 post 它尚未创建,因此它没有任何 $slug范围。为什么调用这个 showAction?尽管我输入 url 只是为了显示表格。
这是开始失败的行的错误日志:
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
我不想调用 ShowAction。
控制器代码如下:
/**
* 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 %}
<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 %}
BlogBundle:Backend/Post:edit.form.html.twig:
{% 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) }}
我遗漏了什么,我该如何更正?先谢谢你了。
问题是您要发布到 /create_post,而这又与路由 /{slug} 匹配。 slug 被设置为 'create_post'。使用 Symfony 2 路由器,第一场比赛获胜,因此您的 showAction 方法被调用。
考虑将 ShowAction 路径设置为:“/show/{slug}”。
或者您可以将 ShowAction 向下移动到控制器文件的底部。这有点危险,因为您可能会忘记并稍后添加不同的操作。但无论哪种方式都行得通。
路由器匹配第一个可能的路由,在本例中为“/{slug}”,其中 slug="create_post".
至少有两种解决方案,第一种最简单,第二种是我推荐的:
Cut/Paste 你的 showAction 到你的文件的底部,在这种情况下,路由器将首先匹配 /create_post 到 createAction
您可以像这样排除:
@Route("/{slug}", requirements={"slug" = "^(?<!create_post).+"})