Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Symfony2创建一个Post调用ShowAction_Forms_Symfony_Redirect_Controller_Render - Fatal编程技术网

Forms Symfony2创建一个Post调用ShowAction

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

我正在将我的旧网站代码“移植”到新的Symfony2.6中。我有一个控制器来呈现一个表单,并像在博客中一样创建帖子。然后,一旦它有效,就在第二个控制器中提交(POST方法)。当我调用路由初始化控制器时,出于某种原因,我忽略了它,它也调用ShowAction($slug),它失败了,因为post尚未创建,因此它没有任何$slug参数。为什么要称之为表演?尽管我键入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
我不想称之为炫耀

以下是控制器代码:

 /**
    * 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版本中它工作起来很奇怪。谢谢!