Хорошая практика MVC

Предположим, у меня была база данных с двумя таблицами:

покупатель

Платежная информация

У таблицы customer были поля: имя, адрес, payment_info_id

payment_info_id - это внешний ключ, который ссылается на строку в payment_info. payment_info имеет поля: id (который связан с payment_info_id), банк, номер счета.

Из-за логики моего приложения каждый раз, когда создается клиент, его платежная информация сохраняется в отдельной строке в поле payment_info, которая связана с его строкой в ​​таблице customer.

Я использую архитектуру MVC.

Имеет ли смысл сохранять это "чистым" и создавать две отдельные модели, по одной для каждой таблицы, а затем перекрестно загружать их и вызывать методы из payment_info_controller в customer_controller, или создавать гибридную модель, которая, как только она создает строку в customer также создает один в payment_info?

Надеюсь, что это имеет смысл!

2 ответа

Решение

Вы не должны полагаться на контроллеры, чтобы сделать это. Поместите логику в вашу модель, за уровень сервиса (если хотите), и вызывайте это из ваших контроллеров.

Вам также следует отменить настройку FK. Вставьте идентификатор клиента в payment_info и удалите его payment_info_id из клиента. Это позволит клиенту иметь несколько платежей.

в контроллере:

$user = new User(name, etc...);
$payment = new Payment(payment details...);
$user->applyPayment($paymentInfo);
$userService->save($user)

в сервисе:

function save($user){
    //save user and update it with an id)
    $user = $userDal->save($user);
    //now that user has an id, you can generate/save payments.
    $payment->save($user->getPayments());

 }

Затем можно было бы сделать так, чтобы userService загружал слой доступа к данным как для пользователя, так и для оплаты.

Сервис / Информация о фасаде: http://www.dofactory.com/net/facade-design-pattern

ПРИМЕЧАНИЕ: - возможно, вы захотите придумать лучшее соглашение об именах, поэтому очевидно, что платеж будет сохранен / сгенерирован этой конкретной службой. например, SaveUserAndPayment($user)

Всегда держите это в чистоте, вам не нужно загружать больше неиспользуемых методов, чем вы могли бы также сделать от клиента, который вы делаете, когда у вас есть какие-то параметры клиента и вам нужно получить что-то связанное с этим, от оплаты вы делаете вещи, когда у вас есть какие-то параметры оплаты и вам нужно что-то выкопать От этого. Вы всегда можете использовать оплату или клиента или любые другие модели с любого контроллера, так что держите его в чистоте, как вы можете gl и hf;)

Другие вопросы по тегам