Хорошая практика 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;)