symfonyとこれらのバンドルFosRestBundle、jms/serializer-bundle、lexik/jwt-authentication-bundleを使用してapi restサーバーを作成します。 Symfony 3 API REST - JSONレスポンスフォーマットの例外をキャッチしてみてください
は、どのように私はこのようなクリーンな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 [email protected] 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 ["[email protected]", "etienne", "ROLE_USER", "$2y$13$tYW8AKQeDYYWvhmsQyfeme5VJqPsll\/7kck6EfI5v.wYmkaq1xynS", 1]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'UNIQ_8D93D649E7927C74'
戻る名前必須または逃したフィールドを持つクリーンなJSON REPONSEを。ここで
私のコントローラ:
<?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()'が期待通りに動作します – kero
コードは動作しますが、json形式のカスタムメッセージエラーが必要です。 – kaneda
ああ、申し訳ありませんが、疑問を誤解しました。だからあなたは逃したフィールドの名前を返すか、または重複したエントリを返したいのですか? rafrsrの答えはこれを(部分的に)解決しますか? – kero