参数未随POST一起传递

时间:2018-09-05 20:31:45

标签: php phalcon

出于某种原因,updateAction函数获取$ id参数并显示$ article内容,但是当尝试使用POST更新时返回:'Uncaught ArgumentCountError:函数ArticleController :: updateAction()的参数太少。

router.php

$router->add('/admin/{id:[0-9]+}', ['controller' => 'article', 'action' => 'update',]);

ArticleController.php

public function updateAction($id)
{
    $article = Article::findFirstById($id);
    $this->view->article = $article;

    if ($this->request->isPost()) {
        $article->title = $this->request->getPost('title');
        $article->content = $this->request->getPost('content');
        $article->created_at = $this->request->getPost('created_at');
        $article->save();
        $this->dispatcher->forward(array('controller' => 'admin', 'action' => 'index'));
    }
}

update.php

{{ form('article/update', 'method': 'post')}}
    <p>
        <label for='title'>Article Title</label>
        <textarea>{{ article.title }}</textarea>
    </p>

    <p>
        <label for='content'>Article Content</label>
        <textarea>{{ article.content }}</textarea>
    </p>

    <p>
        <label for='created_at'>Publication Date</label>
        <textarea>{{ article.created_at }}</textarea>
    </p>

    <p>
        {{ submit_button('Save Changes') }}
        {{ submit_button('Cancel') }}
    </p>
{{ end_form() }}

问题出在哪里?谢谢

3 个答案:

答案 0 :(得分:0)

{{ form('article/update', 'method':'post')}}您没有在此处传递ID。方法将默认为发布。

编辑:实际上,我认为这样的事情应该起作用:{{ form(['article_update', 'id:' article.id], 'method:post') }}

实际上没有办法在此处传递参数,因为我认为https://github.com/phalcon/cphalcon/blob/master/phalcon/tag.zep#L1081

只需这样写-<form action={{ url(['for':'article/update', 'id': article.id]) }} method="post">

但是我想我为什么理解为什么这样做,以鼓励开发人员使用ID作为隐藏的输入元素来提供一个用于创建/更新的端点,但这总体上是一个不好的概念。

答案 1 :(得分:0)

update.php中添加一个id隐藏字段,其ID为值。
ArticleController.php中,从$id中删除updateAction()参数。您可以通过以下方式获取它:

$this->request->getPost('id')

您还可以在isPost验证中添加前两行代码:数据库查询非常昂贵,因此最好先验证isPost(),然后进行查询。

您可能希望从文档中探索本文,以开始使用Phalcon表单:https://docs.phalconphp.com/en/3.3/tutorial-invo#working-with-crud

答案 2 :(得分:0)

您需要传递Article模型的ID。 如果您想为$ id保留GET,可以将其添加到发布网址中。

{{ form('article/update/{{ article.id }}', 'method': 'post')}}

为了安全起见,您可以检查数据库上是否存在“文章”。

if($!article = Article::findFirstById($id))
{
   return $this->response->redirect("/article/new");
}