vyshkant
@vyshkant
developer

Как правильно организовать PHP-код на CodeIgniter?

Здравствуйте!
Работаю над проектом на CodeIgniter. Суть проекта - сайт составления определенных планов.
Постараюсь коротко и ясно описать, что уже есть, и где, как мне кажется, я что-то делаю неправильно или не понимаю чего-то.
Есть следующее:
  • контроллер Activities (+модель, + вьюв), который работает с сущностями Activity (план определенного действия юзера IRL - с названием, датой-временем, описанием)
  • контроллер Destinations (+модель, + вьюв), который работает с сущностями Destination (это план визита в какой-то город - с датами и описанием)

Каждому Activity соответствует какой-то один Destination, т.е. каждое запланированное действие происходит в заранее запланированном месте.
На данный момент всё реализовано так: помимо указанных контроллеров созданы классы Destination, Activity, а также Location (это база городов без привязки к планам юзера). Соответственно, объект класса Activity имеет свойство, которое в его конструкторе инициализируется объектом класса Destination. В то же время, объект класса Destination имеет свойство, инициализирующееся объектом класса Location.

В итоге, в контроллере Activities, почти в каждом методе, имеем примерно следующее:
// подгружаем класс работы с активностями
$this->load->library('activity');

// подгружаем класс работы с дестинейшенами
$this->load->library('destination');

// подгружаем класс работы с локациями
$this->load->library('location');

Т.е. поскольку в моделях проходят операции с объектами класса Activity, то необходимо подключать библиотеку Activity, а также Destination и Location. В итоге, в каждом методе контроллера дублируются три эти строчки. И мне кажется, что я что-то делаю неправильно :)
Оцените, пожалуйста, грамотность моего решения об организации кода и посоветуйте, как эту организацию можно улучшить.

То есть, если сформулировать вопрос конкретнее:
  1. Является ли мой подход к созданию классов Destination, Activity и Location корректным, в смысле вложенности объектов?
  2. Является ли мой подход к созданию классов Destination, Activity и Location корректным, в смысле помещения взаимозависимых сущностей в разные библиотеки?
  3. Является ли мой подход к подключению библиотек корректным?
.

UPD:

На сайте с документацией по CodeIgniter нашел некоторые примеры моделей:
public function insert_entry()
{
    $this->title = $this->input->post('title');
    $this->content = $this->input->post('content');
    $this->date = time();

    $this->db->insert('entries', $this);
}

Здесь мне особо нравится последняя строчка, поскольку, как и отметил @evnuh, модель фактически представляет из себя строку в БД.
В моем же случае, в таблице activities есть поле destination_id (связь с таблицей destinations). А в коде я хотел реализовать это так, чтобы при инициализации Activity одним из ее свойств был объект Destination (уже содержащий всю информацию).
Как это лучше реализовать? Добиться полного соответствия "модель=строка в БД", или в конструкторе модели activities_model инициализировать ее свойство, создав объект класса destinations_model?
  • Вопрос задан
  • 1612 просмотров
Решения вопроса 1
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Всё неверно.
Вы плохо понимаете что такое модель, в классической архитектуре MVC. Всё потому что Codeigniter сам чудит, объясняю модель как хендлер хранилища. Обычно это называется Store, то есть то, что кладёт и берёт из базы. А модель в классическом её виде - это экземпляр объекта из этой базы. Проще говоря, модель - это строчка из таблицы, а Store - массив моделей (вся таблица в БД, кусок таблицы в БД), который их загружает или сохраняет в базу.
Так вот, в идеальном варианте модель должна быть за всё ответственна. Именно класс модели должен быть раздут, именно её вы должны загружать, а не библиотеку и не контроллер. Контроллер вообще, просто, как ГАИшник на посту, должен прочитать инпут, понять, что с ним делать, загрузить модели, сделать с ними что-то и отправить на оутпут.

Убираете всё из библиотек, пишете нормальные модели, придумываете к ним связи (вроде как вы их уже придумали), и работаете с моделями.
А ещё, в один PHP файл можно несколько классов понапихать, это, например, чтобы модель Activity представляла собой Активити, а класс ActivityStore в этом же файле как раз работал с таблицей где хранятся ваши Activity.

Я придумал всё сделать проще, подглядев как это сделано в Yii - в каждой модели у меня есть метод save(), который я вызываю напрямую из экземпляра модели и она ложится в базу. Так же и загрузка Product::get($id) вернёт объект класса модели Product, на котором я могу поменять пару свойств а потом вызвать прямо на этом объекте ->save();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Для

// подгружаем класс работы с активностями
$this->load->library('activity');

// подгружаем класс работы с дестинейшенами
$this->load->library('destination');

// подгружаем класс работы с локациями
$this->load->library('location');


используйте autoload в конфигах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы