Проблема с вашей функцией обновления. Вы должны добавить его к указателю на A.
func (a *A) updateB(n int) {
a.b.c = n
}
Модель является неправильным словом для использования при обсуждении, что сделать с продуктами: каждым продуктом является объект значения (VO) (или передача данных objet/DTO, независимо от того, что помещается в Ваш рот лучше). Объекты значения обычно имеют те же поля, которые содержит таблица. В Вашем случае ProductVO должен иметь поля, которые находятся в таблице продуктов.
Модель является Объектом доступа к данным (DAO), который имеет методы как
findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.
В Вашем случае у Вас был бы ProductDAO, который имеет что-то как вышеупомянутые методы. Этот ProductDAO затем возвратил бы ProductVO и наборы их.
Объекты Доступа к данным могут также возвратить Бизнес-объекты (BO), которые могут содержать несколько и дополнительные методы VO, которые являются конкретной экономической моделью.
Приложение: В Вашем контроллере Вы называете ProductDAO для нахождения продуктов, которые Вы хотите. Возвращенные ProductVO (s) затем передаются представлению (как атрибуты запроса в Java). Представление затем циклы через/дисплеи данные из productVO's.
Модель является частью Вашего приложения, где бизнес-логика происходит. Модель представляет реальные отношения и зависимости между объектами, как: Сотрудник сообщает менеджеру, менеджер контролирует многих Сотрудников, менеджер может присвоить Задачу Сотруднику, Задача отсылает уведомление, когда запоздалый. Образцовый CAN и чаще всего взаимодействует через интерфейс с базой данных, но это не требование.
Представление - в основном все, что может быть отображено или справка в отображении. Представление содержит шаблоны, объекты шаблона, обрабатывает шаблонный состав и вложение, переносится с заголовками и нижними колонтитулами, и производит вывод в одном из известных форматов (X/HTML, но также и XML, RSS/Atom, CSV).
Контроллер является слоем перевода, который переводит пользовательские действия в образцовые операции. Другими словами, это говорит модель, что сделать и возвращает ответ. Методы контроллера должны быть как можно меньше, и вся бизнес-обработка должна быть сделана в Модели, и обработка логики представления должна произойти в поле зрения.
Теперь, назад к Вашему вопросу. Это действительно зависит, если Вы должны разделить класс для каждого продукта. В большинстве случаев один класс будет достаточен, и должны быть созданы 20 экземпляров его. Поскольку продукты представляют бизнес-логику, она должна принадлежать Образцовой части Вашего приложения.
В CakePHP существует еще 3 "части":
Логика, которые используются многими моделями, должна быть сделана как поведение. Я не знаю, имеют ли CodeIgniter эту логику или нет, но если бы она не делает, я попытался бы реализовать ее как таковой. Можно читать о поведениях здесь.
(Компоненты помогают контроллеру совместно использовать логику, и помощники помогают представлениям таким же образом).
Самый простой путь к:
@Alexander упоминает Поведения CakePHPs, Компоненты и Помощников. Они превосходны для абстракции общей функциональности. Я нахожу Поведения особенно полезными с курса, объем бизнес-логики несут в моделях. Я в настоящее время работаю над проектом, где у нас есть поведения как:
и т.д.
Для кода, который превышает даже платформу MVC т.е. библиотеки кода, которыми Вы пользуетесь для различных вещей, которые не связаны к конкретной платформе, которую Вы используете - в наших вещах случая как классы кодирования видео и т.д. CakePHP имеет папку поставщиков.
Что-либо, что эффективно не имеет никакого отношения к CakePHP, идет туда.
Я подозреваю, что CodeIgniter не имеет вполне столь же гибкой структуры, это меньше и легче, чем CakePHP, но беглый взгляд на Руководство CakePHP, чтобы видеть, как Поведения, Компоненты, Помощники и папка Vendors могут быть полезными.
Это должен быть легкий вопрос, чтобы просто включать некоторые общие классы помощника из Ваших моделей, сохраняют хорошими и DRY