Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP

Войти
Регистрация
Восстановить пароль
 
Yourasik
1 / 1 / 1
Регистрация: 31.05.2014
Сообщений: 166
Завершенные тесты: 1
#1

MVC маршруты и БД - PHP

21.02.2018, 13:48. Просмотров 249. Ответов 14
Метки mvc, php (Все метки)

Только начал знакомится с MVС. В сети миллион примеров как реализовать MVC модель на примере простенького сайта где как правило весь маршрут - это `news/index` и `news/1234`, делают это на основе регулярных выражений. Возможно это правильно, хотя выглядит конечно не очень. Меня интересует, как продолжить, например на сайте есть раздел "Электроника"(`somesite.com/electronika/`), если я все правильно понимаю, для этого раздела должен существовать контроллер `ElectronikaConroller` в нем `ActionIndex` метод, в котором мы вызываем "представление" главной страницы раздела "Электроника", соответственно в файле с маршрутами должен быть маршрут с ключом "Electronika". Эти разделы могут иметь `N` дочерних страниц, эти разделы из админ панели сайта необходимо создавать новые, так что для каждого раздела нужен свой контроллер или один общий, например `CatalogController`? Если один общий, тогда при переходе `somesite.com/catalog/`, получаем список каталогов (`ActionIndex`), потом `somesite.com/catalog/electronika`(`ActionSection`), получили список товаров.
На этом этапе я начинаю закипать. Меня интересует 2 вопроса :

1. Правильно ли я себе в воображении нарисовал, что существующие маршруты необходимо хранить в БД? Например есть таблица `catalogs`, и в ней поля `id, name, route` и тд. В `route` хранить ключ, например `electronika` а при переходе по ссылке `somesite.com/catalog/electronika` в контроллере `CatalogController` в методе `ActionSection` обратится к модели `Catalogs`, в которой я подключусь к БД, найду соответствие и отдам в представление результат если он есть?
2. Второй вопрос, это более глубокая вложенность, если первый хоть и не полностью понятен, но более ли менее я его могу себе представить, то тут совсем тупик. Например ссылка следующая `somesite.com/catalog/elektronika/kompyutery-i-komplektuyuschie/komplektuyuschie-i-aksesuary/moduli-pamyati/`, `catalog` - `CatalogController`, `electronika` - `ActionSection` а дальше что, как формировать более вложенные?

Код я еще не писал, вставлять нечего, прошу теорию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2018, 13:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос MVC маршруты и БД (PHP):

Mvc - PHP
Здравствуйте, делаю сайт на MVC. Но проблема в том, что экземпляр класса созданный в контроллере не виден в Модели. Например: ...

Принцип работы MVC - PHP
Добрый вечер! Уже часов 8 пытаюсь понять технологию MVC (Model-View-Controller). Прочитал много статей, просмотрел видео, но никак не могу...

MVC. О вопросе шаблонов. - PHP
Доброго времени суток всем! Начал я потихоньку разбираться в паттерне MVC. Многое проясняется: преимущества и недостатки. И вот тут...

mvc создание динамической логики - PHP
Как я понимаю суть данного шаблона проектирования: каждый раздел имеет свой controller + action которые и формируют страницы и разделы...

простейшая mvc - PHP
Доброго времени суток! Прочитал несколько статей по MVC.. На словах все вроде понятно... но вот код... Наверно нужно сначала PHP поучить...

MVC и php - PHP
Помогите решить проблему, нужно сделать вывод данных из формы с помощью MVC фреймворка CodeIgniter. Есть 3 файла: Код файла...

14
Jodah
Эксперт PHP
2695 / 2367 / 844
Регистрация: 01.08.2012
Сообщений: 8,370
21.02.2018, 14:06 #2
Цитата Сообщение от Yourasik Посмотреть сообщение
например на сайте есть раздел "Электроника"(`somesite.com/electronika/`), если я все правильно понимаю, для этого раздела должен существовать контроллер `ElectronikaConroller`
Если на сайте 100 одинаковых разделов, отличающихся только контентом (текст, картинки, ссылки на статьи и т.п.), нет смысла создавать 100 контроллеров, создаёте один общий.

Единственное, сразу с 1-го уровня начинать динамическую часть не очень удобно (больше геморроя), гораздо проще 1-ым параметром писать название контроллера, вторым id или URL статьи, т.е. site.ru/catalog/electronika, site.ru/products/iphone6s.

А когда идёт сразу site.ru/electronika, появляется промежуточная часть - нужно понять, что такое electronika - статья, товар, категория и т.п.

Цитата Сообщение от Yourasik Посмотреть сообщение
1. Правильно ли я себе в воображении нарисовал
Да.

Цитата Сообщение от Yourasik Посмотреть сообщение
2. Второй вопрос, это более глубокая вложенность
Для удобства создаёте отдельное поле типа `route_cache`и храните там полный URL раздела. Затем в админке нужно будет учесть, что при изменении URL текущего раздела также автоматом должны перегенерироваться пути всех потомков.
1
Yourasik
1 / 1 / 1
Регистрация: 31.05.2014
Сообщений: 166
Завершенные тесты: 1
21.02.2018, 16:47  [ТС] #3
Jodah, подскажите, а как реализовать когда вот такая вложенность somesite.com/catalog/elektronika/kompyutery-i-komplektuyuschie/komplektuyuschie-i-aksesuary/moduli-pamyati/, Понятно что "catalog" это имя контроллера, "electronika" это action метод, а как дальше, что делать с kompyutery-i-komplektuyuschie, komplektuyuschie-i-aksesuary, moduli-pamyati это все принимать как за параметры, то есть фильтровать запрос или еще лепить контроллеров? Я что то запутался((
0
Jodah
Эксперт PHP
2695 / 2367 / 844
Регистрация: 01.08.2012
Сообщений: 8,370
21.02.2018, 21:01 #4
Цитата Сообщение от Yourasik Посмотреть сообщение
"electronika" это action метод
В данном случае можно сделать один метод для всего. У вас ведь всего 2 ситуации - либо после /catalog/ ничего нет и отображаем список разделов, либо что-то есть и отображаем конкретный раздел.

Цитата Сообщение от Yourasik Посмотреть сообщение
это все принимать как за параметры, то есть фильтровать запрос или еще лепить контроллеров?
Зачем? Между /catalog/elektronika/ и /catalog/elektronika/kompyutery/ нет никакой разницы, просто берите текущий URL (только без гет-параметров) и ищите по нему категорию в БД.
0
полудух
177 / 161 / 30
Регистрация: 15.03.2016
Сообщений: 959
22.02.2018, 10:20 #5
Цитата Сообщение от Yourasik Посмотреть сообщение
Jodah, подскажите, а как реализовать когда вот такая вложенность somesite.com/catalog/elektronika/kompyutery-i-komplektuyuschie/komplektuyuschie-i-aksesuary/moduli-pamyati/, Понятно что "catalog" это имя контроллера, "electronika" это action метод, а как дальше, что делать с kompyutery-i-komplektuyuschie, komplektuyuschie-i-aksesuary, moduli-pamyati это все принимать как за параметры, то есть фильтровать запрос или еще лепить контроллеров? Я что то запутался((
геморройный урл так то, много пота, мало толку
/catalog/12345/а_дальше/можно_писать/что_душенька_пожелает/чисто_для_SEO
12345 это как раз ID для модулей памяти
0
otto-fukin
-41 / 42 / 13
Регистрация: 15.06.2017
Сообщений: 380
22.02.2018, 23:55 #6
Цитата Сообщение от Jodah Посмотреть сообщение
Для удобства создаёте отдельное поле типа `route_cache`и храните там полный URL раздела.
тестировал как-то полный url, получилось что при длине url 255 символов, 10 уровней вложенности(т.е. 10 последовательных запросов по фрагментам url) срабатывали на порядок(!) быстрее чем один запрос по целому url используемого в качестве первичного ключа. Страниц в таблице было несколько тысяч. Понятно что длинные строки полностью не индексируются, на коротких url возможно будет эффект, но для себя я решил, что такое кеширование только усложнит роутер..
0
Jodah
Эксперт PHP
2695 / 2367 / 844
Регистрация: 01.08.2012
Сообщений: 8,370
22.02.2018, 23:58 #7
Цитата Сообщение от otto-fukin Посмотреть сообщение
усложнит роутер..
Усложнит в смысле увеличит нагрузку?
0
otto-fukin
-41 / 42 / 13
Регистрация: 15.06.2017
Сообщений: 380
23.02.2018, 00:07 #8
Цитата Сообщение от Jodah Посмотреть сообщение
Усложнит в смысле увеличит нагрузку?
Не, не нагрузку. Просто нужно будет контролировать синхронность кеша и фрагментов url для каждой страницы или раздела. Потенциальная вероятность коллизий. Мелочь конечно. Для себя решил не заморачиваться. до 100 уровней вложенности(тоже тестировал) заметно увеличение времени отклика где-то процентов на 20%. Но это уже какой-то экстрим. На практике можно не заморачиваться ни кешированием url ни количеством уровней вложенности..
0
полудух
177 / 161 / 30
Регистрация: 15.03.2016
Сообщений: 959
23.02.2018, 00:12 #9
на практике каждый следующий уровень надо выяснять - откуда он вообще и что это
а если там слово, то его просто некошерно индексировать по слову, а не по ID
0
Yourasik
1 / 1 / 1
Регистрация: 31.05.2014
Сообщений: 166
Завершенные тесты: 1
26.02.2018, 11:13  [ТС] #10
полудух, а как индексировать по id если в урл параметр - слово? Так как правильно делать, хранить до каждой записи весь урл или частично? Например : somesite.com/catalog/electronika/notebooks/macbook_pro_2012, в записи в БД, в таблице items в поле route_cache хранить /electronika/notebooks/macbook_pro_2012 или только macbook_pro_2012? Наверное надо добавить еще "_id" иначе как идентифицировать, ведь таких макбуков может быть много. Раньше я из заголовка делал ЧПУ и при помощи .htaccess (RewriteEngine On RewriteRule ^(.+)_([0-9]+)$ ?id=$2&itemm=$1 [L]) itemm ЧПУ из бд и id = id. Теперь хочу под MVC переделать, но не могу полностью собрать пазл.
0
полудух
177 / 161 / 30
Регистрация: 15.03.2016
Сообщений: 959
26.02.2018, 12:32 #11
Цитата Сообщение от Yourasik Посмотреть сообщение
Например : somesite.com/catalog/electronika/notebooks/macbook_pro_2012, в записи в БД, в таблице items в поле route_cache хранить /electronika/notebooks/macbook_pro_2012 или только macbook_pro_2012
зачем вот это всё? чё вы себе жизнь усложняете
somesite.com/catalog/12345/electornika-notebooks-macbook-pro-2012 - вот так должно быть
ну в крайнем случае вот так: somesite.com/catalog/12345-electornika-notebooks-macbook-pro-2012
12345 это ID макбука в БД, а всякие route_cache забудьте нафиг.
и чтобы его выцепить rewriteEngine не нужен, сразу в пхп
0
Yourasik
1 / 1 / 1
Регистрация: 31.05.2014
Сообщений: 166
Завершенные тесты: 1
26.02.2018, 18:35  [ТС] #12
полудух, это в бд хранить 12345-electornika-notebooks-macbook-pro-2012? Это id+ЧПУ?
0
полудух
177 / 161 / 30
Регистрация: 15.03.2016
Сообщений: 959
26.02.2018, 18:37 #13
в БД только ID нужен
0
Yourasik
1 / 1 / 1
Регистрация: 31.05.2014
Сообщений: 166
Завершенные тесты: 1
26.02.2018, 18:50  [ТС] #14
полудух, а как ссылку формировать, если в БД только id тогда будет somesite.com/catalog/12345. Или заголовок, который на кириллице переводить в процессе формирования ссылки?
0
полудух
177 / 161 / 30
Регистрация: 15.03.2016
Сообщений: 959
26.02.2018, 18:59 #15
пишите ф-ю, вы ей массив: array('catalog', 12345, 'electronika', 'notebooks', 'macbook-pro-2012'), а она вам строку
0
26.02.2018, 18:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2018, 18:59
Привет! Вот еще темы с ответами:

Трудности с mvc - PHP
Здравствуйте! В процессе работы с MVC возникли некоторые трудности. Модель нужна для получения данных из базы или других...

Построение MVC - PHP
Добрый вечер, у меня такое впечатление, что я строю MVC неправильно. Пример: Есть у меня, авторизация, регистрация,...

MVC php - PHP
Вопрос такой, Насколько это правильно <?php $name = '<span>'.$datas.'</span>'; $balance = '<span>'.$datas.'</span>'; ...

Структура "Маршруты", найти маршруты начинающиеся или оканчивающиеся в заданном пункте - C++
Здравствуйте. Дано такое задание: "Написать программу, отладить ее, протестировать. При упорядочивании записей воспользоваться методом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru