【发布时间】:2021-04-12 16:01:13
【问题描述】:
我查看了很多地方,但我的 PUT 路线无法正常工作。我只是想让我的 PUT 路由编辑路由中指定的文章的 id,这是我的路由的样子:
/**
* @return Response
* @Route("/{id}", methods={"PUT"})
* @param $id
* @param Request $request
*/
public function edit($id, Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$article = $em->find(Article::class,$id);
if ($article)
{
$request->request->add(["article" => json_decode($request->getContent(), true)]);
$form = $this->createForm(ArticleType::class, new Article())->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$article->setNom($form["nom"]->getData());
$article->setDescription($form["description"]->getData());
$article->setPrix($form["prix"]->getData());
$em->refresh($article);
return $this->json($article, 205);
}
return $this->json(["error" => "Bad request"], 400);
}
return $this->json(["error" => "Not Found"], 404);
}
这对我来说似乎很好,但对 Postman 来说却不是,尽管它并不完全糟糕,因为它确实进入了代码!但它返回 400 错误代码,所以我认为这意味着它不会进入第二个 if 并且我不明白为什么,因为我为我的 DELETE 路由使用了类似的设置。我正在尽最大努力了解路由的工作原理,但对于 PUT,即使经过数小时的搜索,我也不知所措,因此非常感谢您的帮助!
如果需要,这里是控制器代码的其余部分。是的,我确实告诉我的订阅者允许“PUT”路由。另外,这是我的第一篇文章,我希望它足以满足本网站的标准,并感谢任何愿意给我一点时间的人!
<?php
namespace App\Controller;
use App\Entity\Article;
use App\Form\ArticleType;
use App\Repository\ArticleRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class ArticleController
* @package App\Controller
* @Route("/article")
*/
class ArticleController extends AbstractController
{
/**
* @return Response
* @Route("/", methods={"GET"})
* @param ArticleRepository $repository
*/
public function index(ArticleRepository $repository): Response
{
return $this->json($repository->findAll());
}
/**
* @return Response
* @Route("/{id}", methods={"GET"})
* @param $id
*/
public function find($id): Response
{
$em = $this->getdoctrine()->getmanager();
$article = $em->find(Article::class,$id);
if ($article)
{
return $this->json($article, 201);
}
return $this->json(["error" => "Not Found"], 404);
}
/**
* @return Response
* @Route("/", methods={"POST"})
* @param Request $request
*/
public function new(Request $request): Response
{
$request->request->add(["article" => json_decode($request->getContent(), true)]);
$form = $this->createForm(ArticleType::class, new Article())->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($form->getData());
$em->flush();
return $this->json($form->getData(), 201);
}
return $this->json(["error" => "Bad request"], 400);
}
/**
* @return Response
* @Route("/{id}", methods={"DELETE"})
* @param $id
*/
public function delete($id): Response
{
$em = $this->getdoctrine()->getmanager();
$article = $em->find(Article::class,$id);
if ($article)
{
$em->remove($article);
$em->flush();
return $this->json($article, 205);
}
return $this->json(["error" => "Not Found"], 404);
}
另外,这是我的邮递员请求
{
"nom": "test",
"description": "description test",
"prix": 7
}
这里是 ArticleType.php
<?php
namespace App\Form;
use App\Entity\Article;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom')
->add('description')
->add('prix')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Article::class,
]);
}
}
【问题讨论】:
-
我认为您可能应该只使用symfony.com/doc/current/form/direct_submit.html ...您也应该检查
$request->getContent()确实包含您期望的内容。最后:您的 400 行应该 - 至少出于开发目的 - 从表单验证中返回实际的错误消息;o) -
这个错误是 Inmarelibero 建议的吗?它返回了一条可在此处查看的长消息:mediafire.com/file/4llywfhbw0qwr17/dump.txt/file 我检查了 $request->getContent() 确实有我的内容!最后,它似乎很相似,但我不明白“Task()”在这里做什么。谢谢!
-
任务就像你的文章。您上传的文件似乎包含一个空的表单错误迭代器(您可以将扩展名重命名为 .html 并在浏览器中查看)。 $request->getContent() 为空。邮递员非常强大,您可以发送基本上无效的请求。你必须检查你想如何编码数据(原始,表单编码,......),如果是原始的,你必须发送正确的内容类型(应用程序/json)和东西。这是我对邮递员的普遍看法。我没有具体的建议,我不使用邮递员,我宁愿使用 curl ;oD POST 请求更好地定义 btw(编码)
-
我做了应用程序/json的事情!正如我所说,它接收内容,邮递员甚至可以在 GET、POST 和 DELETE 上工作!只是不在 PUT 上,这很烦人。像其他作品一样,只是不是 PUT。
标签: symfony routes postman put