Php — Плохо ли если у меня есть места, где путь (строка с указанием пути) повторяется? Например, «files/images/»? Или это нормально?
Мне лучше занести это в отдельную функцию (в моделе - у меня MVC - get_path_images(), например)? Или оставить так - много мест (классов), где повторяется одна и та же строка для указания пути?
И еще. Вот я, например, забил в функцию получение строки с путем. И у меня в других местах повторяется код, где используется строка с путем + еще одна строка (один каталог). Но всего один. Мне также нужно еще одну функцию создавать? Вот, например, первая функция возвращает:
files/images/
А потом есть места, где используется вот такой путь:
files/images/128x128/
Мне для этого тоже функцию создавать? Всего один каталог добавился.
Вообще плохо, когда присутствует текст внутри кода логики!
Все пути (и настройки) - должны быть в хранилище переменных и все они должны быть уникальны.
Если из нескольких переменных пути составляются через их конкатенацию ($a.$b. и т.д.) - должно быть сформировано иерархическое "дерево".
Внутри кода логики - это как? В модели что ли? А если у меня модель User и путь только для картинок User'a (аватарок). Все равно нужно не в модели делать? Логично ведь в модели.
Можно поподробнее про дерево?
Хранилище переменных - это где? У меня есть глобальные переменные - они объявлены в главном Controller - от которого другие контроллеры наследуются. Мне сюда эти переменные писать?
Внутри кода логики - это как? В модели что ли? А если у меня модель User и путь только для картинок User'a (аватарок). Все равно нужно не в модели делать? Логично ведь в модели.
НЕТ.
Должен быть центральный конфиг для всех настроек приложения.
Можно поподробнее про дерево?
Проводник файловый откройте - слева будет дерево каждая папка - это отдельная переменная. Путь - это конкатенация переменных в заданной последовательности.
У меня есть глобальные переменные - они объявлены в главном Controller - от которого другие контроллеры наследуются. Мне сюда эти переменные писать?
ДА.
И это должно быть ЕДИНСТВЕННЫМ хранилищем переменных для ВСЕГО приложения.
xmoonlight, спасибо за ответы.
А вот еще вопрос... У меня глобальные переменные объявлены в Controller (как я уже сказал). Проект начинал делать не я, я всего лишь дорабатываю его. Скажите - правильно ли это - что в Controller переменные пишутся? Или для этого нужно выделить специальный файл? Это на будущее - чтобы потом правильно писать.
И еще. Вот когда в модели есть функции для получения пути (для аватарок, например). Какое-то удобство есть - пользовательские аватарки в моделе User, все логично. А когда все переменные с путями в одном месте - это ведь не так удобно. Если их будет много, в них можно случайно запутаться. Можно как-нибудь разделить их?
sorry_i_noob, для каждой области - необходимы свои переменные. Сейчас в PHP7 можно хранить константы как массив. Разделите переменные так, чтобы один массив - был с глобальными настройками, а остальные - только для нужных областей и загружайте их только тогда, когда задействуете нужную область логики. Массивы - делайте иерархические и ассоциативные! (чтобы не запутаться и легко получать доступ к нужным данным настроек)
И напоследок: MVC - не единственная модель организации приложения!
Удачи в познании!
xmoonlight, у меня просто фреймворк использует MVC.
А как загружать? Вот пользователь зашел в личный кабинет. Нужно использовать константу с путем для аватарок (чтобы отобразить аватарку в личном кабинете). Что мне писать в контроллере? include и путь к моему файлу (точнее константу с путем)?
sorry_i_noob, Контроллер грузит все настройки для авторизованного пользователя, которые могут потребоваться. А среди них - переменная, которая хранит путь к аватаркам.
xmoonlight, я обычно из контроллера к классам обращался. я написал свою константу в отдельный файл. как мне обратиться к этому файлу, чтобы прочитать эту константу? нужно ведь как-то подключить этот файл к проекту? с классами вроде все автоматически делается за счет роутов и функций фреймворка. если я не ошибаюсь. а как с обычными файлами? или нужно константы в класс писать? извините, я новичок.
sorry_i_noob, Когда запускаете с помощью родительского класса - он уже должен через конструктор root-класса был подгрузить все нужные данные.
Если не через класс - используйте глобальный ассоциативный массив, который грузите из файла в самом начале приложения.
xmoonlight, спасибо, вроде разобрался. А вот вы говорите "Вообще плохо, когда присутствует текст внутри кода логики!". А если у меня есть валидация формы, например. И если форма валидацию не прошла. Я отправляю сообщение через AJAX во view - "Выбрано изображение с неверным форматом". Мне вот эту строку тоже в специальном конфиге с константами что ли нужно хранить? Зачем?
И вообще где можно про это почитать? Почему плохо; чем лучше хранить текст в отдельных файлах...
sorry_i_noob, Все валидации - в конфиге валидации входящих и исходящих данных.
Про AJAX: Да, в отдельном массиве строк текущего языка. Для чего - для переводов на другие языки.
Где почитать: откройте документацию к архитектуре любой известной CMS. Затем - откройте документацию к фреймворку, на котором эта CMS написана. Начните с CMS Joomla! и её фреймворка: Joomla! Framework. (как раз там MVC)
xmoonlight, а вот можете еще ответить. Я пишу проект на Kohana. Я занес пути в константы, которые находятся в config-файле. В Kohana чтобы загрузить config-файл используется функция Kohana::$config->load('имя конфиг файла');
Я вызываю эту функцию в тех местах, где мне нужен путь. Скажите - я все правильно делаю? Или нужно как-то по-другому?
xmoonlight, придется тогда в качестве аргумента передавать в каждую функцию, где используются значения из конфига, переменную, в которую загружен массив констант из конфига?