Повторное использование форм и контроллеров в Codeigniter

Я изучаю парадигму OO и MVC (используя Codeigniter и PHP). Я продолжаю находить предупреждения, такие как: Если вы обнаруживаете, что вы вставляете один и тот же код в несколько файлов, то вы не используете OO/MVC правильно. Итак, вот вопрос для более опытных программистов.

  • У меня есть форма для создания, я использую две очень похожие версии:

    • Версия 1 (at /volunteer/register) создается анонимным пользователем. Форма находится в контроллере volunteers и должна быть проверена администратором.

    • Версия 2 (at /admin/create_volunteer) создается администратором входа. Форма и валидация почти одинаковы, но представлены с различными параметрами.

  • Другой, похожий пример:

    Я хочу создавать различные пользовательские информационные панели, которые совместно используют шаблон, но будут использоваться разными ролями пользователей и иметь разные функции и информацию, основанные на роли. Как я вижу, мои варианты:

    • Создайте контроллер Dashboard с тремя функциями, определяющими данные, загруженные в шаблон панели.
    • Добавить функцию панели инструментов для каждого контроллера роли (Volunteer, Admin и т.д.).
    • Создайте контроллер для каждого случая (Volunteer, Admin и т.д.).

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

Мои вопросы:

  • В первом примере мой логический выбор контроллеров (Volunteer и Admin) меньше идеала? Репликация кода в этом случае приемлемая практика?
  • Может ли кто-нибудь рекомендовать инструменты архивирования для установления логической последовательности и хорошего рабочего процесса для MVC?
3 ответа

Кажется, вы хотели бы использовать некоторый ACL для различия между ролями (Volunteer и Admin), которые будут проверять, доступен ли запрошенный модуль или действие.

Создание разных контроллеров для ролей не представляется хорошим выбором, поскольку эту архитектуру нельзя использовать повторно - вы не хотите повторно использовать определенные функции администратора или добровольца в других приложениях, а скорее модуль, который позволяет создавать и контролируйте такие роли.

Вы хотите повторно использовать код, предлагающий определенные функции, это может быть один контроллер, одна модель и некоторые файлы представлений.


Тем более, что две формы не совпадают (разные правила, разные интерфейсы), нет абсолютно ничего плохого в том, чтобы иметь два отдельных файла вида, если вам это нужно. Загрузка одного и того же файла представления в два разных контроллера или методов вполне приемлема, действительно, это уместно. Если есть всего несколько настроек, которые нужно сделать, попробуйте повторно использовать файл представления, передав ему разные данные.

Если вы хотите просто загрузить файл представления формы в разных экземплярах, это спасет вас от дублирования кода. Просто установите разные правила и при необходимости передайте разные данные в представление. Это похоже на использование той же формы для создания и редактирования чего-либо двумя разными способами. Если вывод будет совершенно другим, просто напишите отдельные файлы просмотра. Если это тот же вывод, но с разными данными - определенно повторно используйте его.

Не одержим попыткой не дублировать код фрагмента просмотра - если вы пишете еще больше кода, чтобы принудительно повторно использовать файл вида, изменяя его для разных экземпляров, это как бы поражает цель. Постарайтесь просто сделать общей практикой, чтобы сделать ваш код как можно многоразовым.

Итак, не видя своего фактического кода, я бы сказал, не волнуйся об этом. По моему опыту, файлы просмотра для интерфейсов и интерфейсов почти всегда уникальны (совершенно другой пользовательский интерфейс). В общем случае, если вы обнаружите, что вы дублируете один и тот же очень похожий код, настало время написать для него функцию, класс или шаблон.


Большинство программистов рассматривают дублированный код как знак того, что решение проблемы может быть улучшено.

Если проблема в вашем случае состоит в том, что параметр from определен в одном контроллере, но вам нужно использовать его и на другом контроллере, тогда вам нужно лучше определить форму, чтобы оба контроллера имели доступ к ней независимо от друг друга.

Сделайте конфигурацию формы, чтобы ее можно было повторно использовать.

licensed under cc by-sa 3.0 with attribution.