Symfony我的Controller::updateAction()要求您为"$name"参数提供一个值。

3
使用Symfony 2,在尝试传递参数/变量时,我遇到了这个错误:
Controller "MyBundle\Controller\ManageController::updateAction()" 
requires that you provide a value for the "$name" argument (because there is 
no default value or because there is a non optional argument after this one).

this the entity/model Parcs:

namespace MyBundle\DatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Parcsimmobilier
 *
 * @ORM\Table(name="parcs")
 * @ORM\Entity
 */
class Parcs
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=150, nullable=false)
     */
    private $name;

首先,我有一个小枝,可以让用户修改/更新一个公园,我使用JavaScript使select tag在html中显示一个表单,在选择后的另一个路径/小枝中展示。下面是用户选择要更新的公园的代码:

{% block content %}
<div class="form-group">
  <label class="control-label">Which Parcs would you like to update ?</label>
  <form action="{{ path('UpdateParcs_form' , {'name':'parcs.name'}) }}" method="GET">
    <select class="form-control" id="selectpicker">
      <option disabled selected> select your parc </option>
      {% for parcsimmobilier in parc %}
        <option value="parc"><strong>{{ parcs.name}}</strong></option>
      {% endfor %}
    </select>
  </form>
</div>
{% endblock %}

这是一段JavaScript代码,它可以在用户选择其他路线并显示更新表单后将其重定向:

$(function() {
    $('#selectpicker').change(function() {
        this.form.submit();
    });
});

现在需要Twig来显示更新表单的选定公园:

{% block content %}
    <form action="{{ path('updateParcs_process') }}" method="POST">
      <div>
      {{ form_label(form.name, "change the name of the parc", {'label_attr': {'class': 'control-label'}}) }}
        <div>
          {{ form_widget(form.name, {'attr': {'class': 'form-control'}}) }}
        </div>
      </div>

      <input type="submit" value="Update" class="btn btn-success"/>
    </form>
{% endblock %}

当我点击更新按钮时,出现以下错误信息:
“控制器"MyBundle\Controller\ManageController::updateAction()"要求您为"$name"参数提供一个值(因为没有默认值或者在此参数之后有一个非可选参数)。”
这是我的控制器代码,包括更新操作:
public function updateAction($name) {

    $em = $this->getDoctrine()->getManager();
    $parc = $em->getRepository('MySpaceDatabaseBundle:Parcs')->find($name);
    $form = $this->createForm(new ParcsType(), $parc);

    $request = $this->get('request');

    if ($request->isMethod('POST') | ($form->isValid())) {

            $form->bind($request);
            $parc = $form->getData();
            $em->flush();

            return $this->redirect($this->generateUrl('index_parcs'));
        }

    //retourner le formulaire d'ajout si c'est invalide
    else {
            return $this->render('MySpaceManageBundle:Parcs:updateParcs.html.twig', array('form' => $form->createView(), 'parc' => $parc, 'name' => $name));
         }
}

这是我的路由文件:

# index for management
index_Parcs:
    path:     /manageparcs
    defaults: { _controller: MySpaceManageBundle:Manage:indexParcs }
    requirements:
    methods: GET

# route for display the form after the select choice
updateParcs_form:
    path:     /manageparcs/update/form/{name}
    defaults: { _controller: MySpaceManageBundle:Manage:update }
    requirements:
    methods: GET

# route for processing form with update
updateParcs_process:
    path:     /manageparcs/update/form/success
    defaults: { _controller: MySpaceManageBundle:Manage:update }
    requirements:
    methods: POST

我的问题如下: 为什么会出现这个错误?怎么修复它? 如何使用 updateAction() 正确更新我的实体/模型?如何通过 Symfony 的 路由 传递 参数


1
有时使用 name,有时使用 nom。不匹配... - Emii Khaos
@Paziツ,抱歉,我粘贴代码时犯了个错误。我是一名法国开发者,为了在StackOverflow上找到问题,我会将我的函数和名称进行翻译。我会编辑我的代码。 - french_dev
updateAction($name = null)会处理错误消息。然而,使用两个不同的路由调用具有不同参数的相同操作有些棘手。我会使用两个操作。请注意,您也可以直接向路由添加默认值。 - Cerad
@Cerad,我尝试了你的解决方案,但是出现了这个错误:MySpace\DatabaseBundle\Entity\Parcs查询缺少标识符id。 - french_dev
是的,你需要花些时间了解 find 和 findBy 之间的区别。 - Cerad
@Cerad,即使我使用FindBy和数组,更新仍然不匹配。 - french_dev
2个回答

3
updateParcs_form:
    path:     /manageparcs/update/form/{name}
    defaults: { _controller: MySpaceManageBundle:Manage:update }
    requirements:
    methods: GET

# route for processing form with update
updateParcs_process:
    path:     /manageparcs/update/form/success
    defaults: { _controller: MySpaceManageBundle:Manage:update }
    requirements:
    methods: POST

你的第二个路由没有像第一个一样指定名称参数。
原因是该方法期望有参数,但基于此配置不会提供参数。
除非你想为POST请求创建另一个操作,否则你需要将名称添加到POST URI中。
path:     /manageparcs/update/form/{name}/success

您需要使用该参数生成URI。


他在POST请求中传递了name参数。 - Michael Sivolobov
@Flosculus,我不再遇到错误“Controller"MyBundle\Controller\ManageController::updateAction()"...non optional argument after this one)”。但是更新操作并不匹配。实际上,我想更改公园的名称,我已经按照您的建议更新了我的代码,但是如果我在表单中输入文本以更改邮件,则不会更新之前在选择标记中选择的公园的名称。 - french_dev
另外,我刚刚意识到,在我的URL中,当我像你建议的那样更改我的路由文件中的代码时,没有我的选择名称字段的名称,例如localhost/manageparcs/update/form/nameOfMyparc,而是像这样有参数parcs.name:localhost/manageparcs/update/form/parcs.name?。我想我忘记了什么,比如选择器必须在我的模型/实体中选择名称字段。(抱歉我有点困惑) - french_dev

1
除了您的控制器参数为$nom,而路由配置为name之外,您正在做正确的事情。根据其他文件,只需更改配置即可轻松解决:

routing.yml中的name更改为nom

updateParcs_form:
path:     /manageparcs/update/form/{nom}
defaults: { _controller: MySpaceManageBundle:Manage:update }
requirements:
methods: GET

抱歉,我在粘贴代码时犯了一个错误。作为一名法国开发者,在发布问题时,我将其翻译成英语,以便更好地理解这个网站。我忘记了一些“nom”字段,现在我已经更新了我的代码。真的很抱歉。 - french_dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接