CakePHP, где разместить общий код?

Я разрабатываю приложение на Cake, которое активно взаимодействует с файловой системой. Основная идея состоит в том, чтобы отслеживать и индексировать папку, ее подпапки и файлы и сохранять метаданные для каждого файла в базе данных. Пока все работает нормально, но теперь у меня возникла проблема с пониманием механики MVC.

Я получил этот тяжелый FilesController с множеством функций, проверяющих актуальность файла или его перемещение, обновление записей в базе данных и т. Д. Теперь я хочу вызвать некоторые из этих действий из оболочки / cronjob и я хочу позвонить им в браузере тоже.

Я слышал, как многие люди жалуются на импорт контроллеров в оболочках, и мне кажется, что я понял, почему это плохая идея. Но теперь я хочу использовать тот же код, который взаимодействует с FileModel непосредственно в оболочке и в контроллере. Где его поставить? Какова лучшая практика в этой ситуации? В компоненте загружается модель? В контроллере импортировать его в оболочку?

заранее спасибо за помощь <3

3

Решение

Я получил этот тяжелый FilesController с большим количеством функций, проверяющих,
файл обновлен или, если он был перемещен,

Неправильное место, тяжелые контроллеры определенно не правы. Вы хотите толстые модели, тощие контроллеры. Если есть логика, которая извлекает метаданные, я, вероятно, поместил бы ее в app / Utility / FileMetaData или app / Lib / FileMetaData.php и сделал бы ее новым классом. В зависимости от того, что он делает, вы можете расширить базовый класс Folder или File.

Логика обработки метаданных и чтения папки должна идти в модель. Модель можно использовать из оболочки, как в контроллере, используя свойство $ using с массивом моделей.

Для создания экземпляра этого класса я бы использовал вспомогательный метод (я не под этим подразумевается помощник вида!) в модели, такой как getMetaDataReader (), которая возвращает экземпляр. Причиной этого является возможность смоделировать результат вызова этого метода в модульном тесте. Кроме того, если вы когда-либо измените аргументы класса или конструктора, вам придется изменить только одно место.

Контроллеры явно не правы в оболочках. Там нет просьбы иметь дело с. Конечно, технически вы можете делать трюки и создавать их там, но это просто неправильно и не имеет никакого смысла. Если вы думаете, что должны или «должны» это сделать, значит, что-то не так с вашей архитектурой приложения.

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

2

Другие решения

Других решений пока нет …