当前位置: 首页 > 知识库问答 >
问题:

我的控制器::updateAction() 要求您为“$name”参数提供一个值

施慈
2023-03-14

使用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).

这是实体/模型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;

首先,我有一个分支,它可以允许用户修改/更新Parc,我使用JavaScript允许html中的<code>select标签

{% 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();
    });
});

现在,树枝向谁显示表单以更新所选parc:

{% 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 %}

因此,当我在“更新”按钮上提交时,出现了错误:

控制器“my bundle \ Controller \ manage Controller::update action()”要求您为“$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中通过路由传递参数。

共有2个答案

黄昊
2023-03-14

除了在控制器中将< code>$nom作为参数,而在路由配置中将< code>name作为参数之外,您做的事情是正确的。根据其他文件,只需更改配置即可:

将< code>routing.yml中的< code>name更改为< code>nom:

updateParcs_form:
path:     /manageparcs/update/form/{nom}
defaults: { _controller: MySpaceManageBundle:Manage:update }
requirements:
methods: GET
上官波鸿
2023-03-14
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。

 类似资料:
  • 我试图在JUnit 5中开发一个参数化测试,如下例所示。 尝试运行测试导致异常: 您必须为此@ParameterizedTest提供至少一个参数 这个信息让我觉得,我做错了什么,不是吗? p、 我有一个假设,只有原语类型的参数可用。

  • 我是JavaFx新手,因此我找不到解决问题的方法 假设我有以下应用程序结构: 在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在中输入一个文本,然后按下按钮,按下按钮后,我希望文本显示在使用另一个控制器的中。我已经阅读了很多关于和可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。 如果你们专家能在这方面

  • 我试图实现的是从main方法获取控制器实例,这样我就可以从另一个类调用控制器的方法并更新fxml。总之,这是我的代码: 主要类别: 我的控制器类: 试图调用控制器方法的类: 下面是我的错误信息: ConnectionHandling类:

  • 我有一个测试,它可以做以下几点 我在一个吞吐量控制器中有一个GET请求。对于这个请求,我使用正则表达式提取器获取请求属性的值 如果我在一个吞吐量控制器中有两个请求,我就能够做到这一点。但是,如果我在2个不同的吞吐量控制器中有2个请求,同样的情况就不起作用了。 有人能帮忙吗?

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 我想做的是在我的登录页面上读取一个超文本传输协议参数,例如,然后将传递给我的AuthenticationProvider。我的想法是以某种方式将保存在一个隐藏参数中,但我仍然不知道如何传递它。这可能吗?我该怎么做? 编辑:遵循萨那特的建议,在阅读了一些内容之后,我终于能够解决这个问题 - 如果你对我是如何做到的感兴趣,请看下面。