Абстракция CRUD-представления CodeIgniter

#php #codeigniter

#php #codeigniter

Вопрос:

Я создаю CMS с использованием CodeIgniter, и я в тупике относительно наилучшего способа обработки различных CRUD-представлений. Учитывая, что мой URL похож на…

 mydomain.com/admin/app/content/pages/edit
  

… где ‘admin’ — мой контроллер, а ‘app’ — мой метод действия, в настоящее время я сопоставляю сегменты 3, 4 и 5 с реальными каталогами / файлами, например:

 /views
    /admin
        /content
            /pages
                list_view.php
                edit_view.php
                add_view.php
            /banners
                list_view.php
                edit_view.php
                add_view.php
  

Одно предостережение заключается в том, что мне нужно вызывать разные методы модели, отличные от CRUD, в зависимости от того, какая страница вызывается, поэтому мой метод действия app () начинает иметь неприятный блок if ..else. Кроме того, представления каждого раздела будут выглядеть по-разному из-за разных табличных данных, поэтому я не вижу, как я могу избежать множества страниц просмотра. Очевидно, что недостатком всего этого является то, что 1) Я повторяю много кода, и 2) если я добавлю новый раздел администратора, мне придется физически создавать множество новых каталогов и добавлять новую часть в блок if … else .

Итак, мои вопросы:

  1. Как я могу уменьшить количество каталогов и страниц просмотра, которые я создаю?
  2. Могут ли методы list_fields() или field_data() поддаваться какой-либо автоматизации?

Одна из моих идей заключалась в том, чтобы профилировать таблицу, с которой я взаимодействую, создать динамический ассоциативный массив, который определяет, какие поля я хочу отобразить, а также тип элемента формы, которым он должен быть, а затем передать это в общий вид. Мысли? Недостатки?

Ответ №1:

Хотя это может не дать прямого ответа на ваш вопрос, оно может предоставить вам основу для разработки вашего CRUD. Я уже довольно давно использую GroceryCRUD и в значительной степени клянусь им для базовых и продвинутых операций CRUD. Он довольно хорошо спроектирован и построен, и, помимо индивидуальной файловой структуры, похоже, предлагает все, что вы ищете.

CRUD можно легко изменить, чтобы включить структуру файла / URL, которую вы тоже ищете.

См. http://www.grocerycrud.com /

Комментарии:

1. Отлично, спасибо. На самом деле я только что нашел GroceryCRUD около часа назад и начинаю погружаться. Я бы поддержал вас, но у меня пока недостаточно репутации. 🙂

2. Получите некоторую репутацию 😉 GroceryCRUD — это фантастика. Просто будьте осторожны, чтобы не слишком полагаться на CRUD. Все они хороши в разработке, но я часто обнаруживаю, что мои приложения перерастают CRUD, и в конечном итоге мне все равно нужно его правильно разрабатывать. Более поздние версии Grocery великолепны — доступно множество обратных вызовов, загрузок и т. Д. Отношения 1-many и 1-1 тоже хороши. Удачи с вашим проектом.

3. Просто просматривал мои старые сообщения на предмет оставшихся без ответа — вы можете принять ответ, если он правильный, даже если, кстати, вы еще не можете проголосовать.

Ответ №2:

Вы можете расширить CI_Model и использовать некоторые функции отражения, такие как GetProperties(), чтобы помочь с вашими общими CRUD. В сочетании с list_fields () CI, как вы упомянули, вы определенно могли бы создать для этого несколько общих страниц.

Примером, который может обрабатывать данные формы для любого объекта, может быть

 function processForm() {
    $props = $this->self->getProperties(ReflectionProperty::IS_PUBLIC);
    foreach ($props as $prop) :
        $prop->setValue($this,$this->input->post($prop->getName()));
    endforeach;
}
  

где

 $this->self = new ReflectionClass($this);
  

Комментарии:

1. Отлично, спасибо. Я не знаком с отражением (пока), но я изучу его. Я бы поддержал вас, но у меня пока недостаточно репутации. 🙂

2. Определенно полезный материал, когда вы хотите приступить к написанию повторно используемого кода.