/** * Выполняет действие над объектом * @param string $action * @param Request|null $request * @return Form|true true если форма была отправлена и успешно обработана(в остальных случаях она будет содержать ошибки) */ public function processAction($action, Request $request = null) { if (is_null($this->type)) { throw new \Exception('wrong type'); } $this->checkAction($action); $this->auth->setEntityName($this->type); $action_data = self::getActionData($action); $object = null; if ($action == 'reg') { $object = $this->create(); } $form_action = $this->router->generate('process_action', array('action' => $action, 'type' => $this->type)); $form = $this->form_builder->createForm($object, $action_data['caption'], $action_data['is_login'], $form_action, null, !is_null($request)); if (is_null($request)) { return $form; } $form->handleRequest($request); if (!$form->isSubmitted() || !$form->isValid()) { return $form; } $ok = false; switch ($action) { case 'logout': try { $this->auth->Logout(); $ok = true; } catch (\Exception $e) { $form->addError(new FormError('Ошибка выхода: ' . $e->getMessage())); } break; case 'login': try { $data = $form->getData(); $this->auth->Authenticate($data['login'], $data['password']); $ok = true; } catch (\Exception $e) { $form->addError(new FormError($e->getMessage())); } break; case 'reg': try { $this->em->persist($object); $this->em->flush(); $ok = true; } catch (UniqueConstraintViolationException $e) { $form->addError(new FormError('Такой пользователь уже существует')); } catch (\Exception $e) { $form->addError(new FormError('Внутренняя ошибка сервера, попробуйте позднее')); } break; default: throw new \Exception('unhandled form type'); } return $ok ? true : $form; }