Начал читать данную книгу, непонятен смысл одного финта, который там используется. Постараюсь описать подробно, для тех, кто книгу не читал, но фишку сечет.
Итак, рассматривается пример CRM, в БД приложения (на данный момент) 2 таблицы - customers & phones. Для добавления новой записи в БД автор использует не Active Record напрямую, а т.н. translation layer. Как это выглядит. Для каждой таблицы существует 2 модели - Active Record и Domain model. Вторая состоит лишь в объявлении публичных свойств и описании конструктора, который задает значения этих публичных свойств.
Далее в контроллере объявляются 2 метода:
- store - который принимает объект типа domain model, создает объекты Active Record и записывает в таблицы
- makeCustomer - который принимает объекты Active Record и "конвертирует" их в объект domain model
Код: Выделить всё
$this->store($this->makeCustomer($customer, $phone));
Собственно вопрос - к чему все эти финты ушами? Сорри, если написано не слишком понятно, на всякий случай привожу код
Код: Выделить всё
public function actionAdd() {
$customer = new CustomerRecord();
$phone = new PhoneRecord();
if($this->load($customer, $phone, $_POST)) {
$this->store($this->makeCustomer($customer, $phone));
return $this->redirect('/customers');
}
return $this->render('add', compact('customer', 'phone'));
}
private function store(Customer $customer) {
$customer_record = new CustomerRecord();
$customer_record->name = $customer->name;
$customer_record->birth_date = $customer->birth_date->format('Y-m-d');
$customer_record->notes = $customer->notes;
$customer_record->save();
foreach($customer->phones as $phone) {
$phone_record = new PhoneRecord();
$phone_record->number = $phone->number;
$phone_record->customer_id = $customer_record->id;
$phone_record->save();
}
}
private function makeCustomer(
CustomerRecord $customer_record,
PhoneRecord $phone_record
) {
$name = $customer_record->name;
$birth_date = new \DateTime($customer_record->birth_date);
$customer = new Customer($name, $birth_date);
$customer->notes = $customer_record->notes;
$customer->phones = new Phone($phone_record->number);
return $customer;
}