【发布时间】:2017-10-06 16:21:40
【问题描述】:
我使用 Symfony 和这些捆绑包 FosRestBundle、jms/serializer-bundle、lexik/jwt-authentication-bundle 创建 api rest 服务器。
我怎样才能像这样发送一个干净的 json 响应格式:
Missing field "NotNullConstraintViolationException"
{'status':'error','message':"Column 'name' cannot be null"}
or
{'status':'error','message':"Column 'email' cannot be null"}
Or Duplicate entry "UniqueConstraintViolationException" :
{'status':'error','message':"The email user1@gmail.com exists in database."}
代替系统消息:
UniqueConstraintViolationException in AbstractMySQLDriver.php line 66: An exception occurred while executing 'INSERT INTO user (email, name, role, password, is_active) VALUES (?, ?, ?, ?, ?)' with params ["user1@gmail.com", "etienne", "ROLE_USER", "$2y$13$tYW8AKQeDYYWvhmsQyfeme5VJqPsll\/7kck6EfI5v.wYmkaq1xynS", 1]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user1@gmail.com' for key 'UNIQ_8D93D649E7927C74'
返回一个干净的 json 响应,名称为必填字段或遗漏字段。
这里是我的控制器:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\User;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Symfony\Component\Debug\ExceptionHandler;
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\RestBundle\Controller\Annotations as Rest; // alias pour toutes les annotations
class DefaultController extends Controller
{
/**
* @Rest\View()
* @Rest\Post("/register")
*/
public function registerAction(Request $request)
{
//catch all errors and convert them to exceptions
ErrorHandler::register();
$em = $this->get('doctrine')->getManager();
$encoder = $this->container->get('security.password_encoder');
$username = $request->request->get('email');
$password = $request->request->get('password');
$name = $request->request->get('name');
$user = new User($username);
$user->setPassword($encoder->encodePassword($user, $password));
$user->setName($name);
$user->setRole('ROLE_USER');
try {
$em->persist($user);
$em->flush($user);
}
catch (NotNullConstraintViolationException $e) {
// Found the name of missed field
return new JsonResponse();
}
catch (UniqueConstraintViolationException $e) {
// Found the name of duplicate field
return new JsonResponse();
}
catch ( \Exception $e ) {
//for debugging you can do like this
$handler = new ExceptionHandler();
$handler->handle( $e );
return new JsonResponse(
array(
'status' => 'errorException',
'message' => $e->getMessage()
)
);
}
return new Response(sprintf('User %s successfully created', $user->getUsername()));
}
}
谢谢
【问题讨论】:
-
你确定这段代码被正确执行了吗?我刚刚在现有的 symfony 项目中尝试过,
catch()按预期工作 -
代码可以工作,但我想要 json 格式的自定义消息错误。
-
啊,对不起,误读了这个问题。所以你想返回遗漏字段的名称或重复条目? rafrsr 的答案是否(部分)解决了这个问题?
-
只是部分,因为在我的控制器中我不使用表单。
标签: json symfony exception fosrestbundle symfony-3.2