Ответ 1
Попробуйте изменить Exception
→ \Exception
, если вы не указали PDOException
как Exception
в инструкции использования. PHP пытается найти \YourNamespaceWithController\Exception
вместо \Exception
.
Это обработчик маршрута для моего действия удаления. Он работает хорошо, пока элемент не имеет никаких ассоциаций.
public function projectDeleteAction()
{
try {
$request = $this->get('request');
$my_id = $request->query->get('id');
$em = $this->get('doctrine.orm.entity_manager');
$item = $em->find('MyBundle:Main', $my_id);
$em->remove($item);
$em->flush();
$info = $item->getName();
$result = 0;
}
catch (Exception $e) {
$info = toString($e);
$result = -1;
}
return $this->render('MyBundle:Main:response.xml.twig',
array('info' => $info, 'result' => $result ));
}
Я уже решил ошибку при попытке удалить элемент с ассоциациями, но через этот процесс "флеш" выбрасывал PDOException. Я пробовал различные способы поймать его, но он, похоже, попадает в Symfony2, а затем отвечает HTTP-ошибкой. Есть ли способ, которым я могу заставить Symfony2 не поймать это, чтобы я мог справиться с этим? Это ответ XML с использованием AJAX, поэтому я бы скорее просто отправил код ошибки в соответствии с приведенным выше.
Попробуйте изменить Exception
→ \Exception
, если вы не указали PDOException
как Exception
в инструкции использования. PHP пытается найти \YourNamespaceWithController\Exception
вместо \Exception
.
Лучше поймать исключение, которое вы действительно хотите поймать. В этом примере это, вероятно, Doctrine/DBAL/DBALException и/или Doctrine/DBA/DBAException.
Таким образом,
catch (Doctrine\DBAL\DBALException $e) {
$result = -1;
};
Я бы подумал о чем-то вроде:
} catch (\Exception $e) {
switch (get_class($e)) {
case 'Doctrine\DBAL\DBALException':
echo "DBAL Exception<br />";
break;
case 'Doctrine\DBA\DBAException':
echo "DBA Exception<br />";
break;
default:
throw $e;
break;
}
}
Это фактически ловит исключения БД, и если по какой-то причине происходит какое-то другое исключение, это возвращается обратно в Symfony2.
Мне пришлось сделать следующее, что может помочь некоторым пользователям;
try{
$this->doctrine->em->persist($user);
$this->doctrine->em->flush();
}catch(Exception $e){
if($e->getPrevious()->getCode() == 23505){
//handle duplicate error, 23505 is for postgres, 23000 is mysql unique constraint.
}
}