MVC Pattern & Database Design - PullRequest
       11

MVC Pattern & Database Design

0 голосов
/ 29 марта 2011

Я пытаюсь найти лучший способ сделать это, не уверен, что это мой код или я просто что-то упустил.

Я пытаюсь реорганизовать наше внутреннее приложение факса с помощью доктрины (1.2) и использую MVC - когда факс получен, он попадает в список. Затем пользователь может выбирать, что с ним делать - в данный момент пересылать, архивировать или уничтожать.

Когда они выбирают один из них, он генерирует действие рабочего потока для факса, которое вставляет запись в следующую таблицу:

fax_id | from_status_id | to_status_id | completed | cancelled

Первоначально, статус равен нулю для обозначения «необработанного» * ​​1008 *

status_id ищет строку в таблице fax_status.

В настоящее время код выглядит так

Controller:

function action_shred($fax_id)
{

    $fax = Doctrine_Core::getTable('fax')->findOneById($fax_id);

    // error handling for checking it exists and belongs to the user

    $fax->shred();

}

и в модели

function shred()
{

    $wf = new FaxWorkFlow();
    $wf->fax_id = $this->id;
    $wf->from_status_id = $this->status_id;
    $wf->to_status_id = Doctrine_Core::getTable('fax_status')->findOneByStatus("Shredded")->id;
    $wf->completed = 0;
    $wf->cancelled = 0;
    $wf->save();
    $this->status_id = Doctrine_Core::getTable('fax_status')->findOneByStatus("Queued")->id;

}

Я также нахожу проблемы с такими вещами, как поиск в очереди факсов, поскольку я должен сделать следующее:

$queued_id = Doctrine_Core::getTable('fax_status')->findOneByStatus("Queued")->id;
$queued_faxes = Doctrine_Core::getTable('fax')->findByStatusId($queued_id);

Есть ли проблемы с этим или есть лучший способ сделать это? Я просто думаю, что код выглядит очень некрасиво, и кажется очень хакерским поиск значения поиска в модели факса (возможно, следует перенести его в модель обработки факсов?)

Очень заманчиво жестко закодировать значения состояния в модели, но если они изменятся в будущем, это вызовет проблемы.

в общем, я просто ищу мнение о том, является ли то, что я получил, «правильным», или мне нужно посмотреть на перекодировку, прежде чем я пойду слишком далеко по этому маршруту

1 Ответ

0 голосов
/ 12 апреля 2013

Я хочу решить две проблемы, обнаруженные в комментариях.

Во-первых, обычно лучше моделировать завершенное состояние, а не переходить из одного состояния в другое.Исключение составляют случаи, когда вам нужно смоделировать графики с помощью рекурсивных запросов, детализирующих выбранные пути, и можно переходить из одного состояния в несколько других состояний одновременно.В противном случае ничего не получится при дублировании from_state_id и to_state_id.было бы лучше иметь поле метки времени для отслеживания, когда произошло событие, состояние завершено, и идентификатор факса.

Второй момент - это мнение Мэтью Вуда об автоматизации аудита с использованием триггеров.По моему опыту, это имеет тенденцию вызывать две вещи, обе из которых очень хороши.Во-первых, одитинг сложнее обойти.Вот что он делает.Второе, однако, заключается в том, что это усложняет обход допущений безопасности вашего приложения в той степени, в которой ваши триггеры аудита зависят от них.Если у вас есть такие предположения, активные, если вы нарушите их таким образом, что триггер выйдет из строя и выдаст ошибку, ваши записи будут прерваны.

...