在我的自定义插件中,我向服务器发送write
请求,服务器响应系统(500)错误:POST http://0.0.0.0:8080/api/my-entity 500 (Internal Server Error)
错误是已知的和预期的,它来自数据库,因为重复的条目:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'test' for key 'my_entity.name'
但是,我如何或在哪里捕捉和处理服务器端的错误,以清除错误消息?我已经找到了这个描述,但我会在响应之前处理错误,以设置正确的http错误。
错误处理似乎是一个错误
对于这个特定的用例,使用WriteCommandExceptionEvent
而不是PreWriteValidationEvent
:更合适
// MyEntityValidationSubscriber.php
<?php declare(strict_types=1);
...
use MyPluginDALExceptionDuplicateEntryException;
use ShopwareCoreFrameworkDataAbstractionLayerWriteCommandInsertCommand;
use ShopwareCoreFrameworkDataAbstractionLayerWriteValidationWriteCommandExceptionEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class MyEntityValidationSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
WriteCommandExceptionEvent::class => 'onWriteCommandException'
];
}
public function onWriteCommandException(WriteCommandExceptionEvent $event)
{
foreach($event->getCommands() as $command) {
if($command->getEntityName() !== 'my_entity') {
continue;
}
$haystack = $event->getException()->getMessage();
$needleDuplication = "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry";
$needleProperty = "key 'my_entity.name'";
if(
$command instanceof InsertCommand
&& strpos($haystack, $needleDuplication) !== false
&& strpos($haystack, $needleProperty) !== false
) {
throw new DuplicateEntryException('violation.unique.myEntityName');
}
}
}
}
Excpetion级
// DuplicateEntryException.php
<?php declare(strict_types=1)
...
use ShopwareCoreFrameworkShopwareHttpException;
use SymfonyComponentHttpFoundationResponse;
class DuplicateEntryException extends ShopwareHttpException
{
public function __construct(string $message, array $parameters = [], ?Throwable $e = null)
{
parent::__construct($message);
}
public function getErrorCode(): string
{
return 'DAL_DUPLICATE_ENTRY_EXCEPTION';
}
public function getStatusCode(): int
{
return Response::HTTP_BAD_REQUEST;
}
}