出于某种原因,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() }}
问题出在哪里?谢谢
答案 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");
}