Структура контроллеров и методов витрины

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Структура контроллеров и методов витрины

Сообщение n.osenni »

Учусь, разбираюсь. И когда начал разбирать создание витрины, возникли разные варианты реализации. А как правильнее - это хочу спросить у вас.

Тестовый проект-витрина отображает карточки направлений деятельности - directions (например, покраска, чистка, доставка и т.п.). Все виды деятельности с доп информацией хранятся в БД в таблице deriction: одна направление деятельности - одна строка. При клике на карточку следует вывести подробную информацию о направлении на отдельной странице (данные из той же таблицы).

Собственно вопросы:
  • Какие должны быть контроллеры? Или всё писать в одном?
  • Как быть с методами контроллера? В частности интересует ситуация с получением данных обо всех направлениях (для вывода карточек)
    и только для какого-то одного направления. Можно сделать два метода (но в каких контроллерах) или же один общие, который если передано имя возвращает информацию только о запрошенном?
  • Как быть с видами? Для карточек один вид? Для информации подробной о выбранном направлении другой? Или всё в одном виде с if/else
  • Если всё в одном виде, то URL будет примерной такой

    Код: Выделить всё

    site/directions?direction_name=direction_name_velue
    . Какие ещё есть варианты?
Как быть?
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Re: Структура контроллеров и методов витрины

Сообщение n.osenni »

Я знаю о существовании gii. Вопрос не в том. А в том, как делить приложение на контроллеры и т.п. Или делать всё в одном контроллере, например.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Структура контроллеров и методов витрины

Сообщение zelenin »

n.osenni писал(а): 2017.12.14, 12:20 Учусь, разбираюсь. И когда начал разбирать создание витрины, возникли разные варианты реализации. А как правильнее - это хочу спросить у вас.

Тестовый проект-витрина отображает карточки направлений деятельности - directions (например, покраска, чистка, доставка и т.п.). Все виды деятельности с доп информацией хранятся в БД в таблице deriction: одна направление деятельности - одна строка. При клике на карточку следует вывести подробную информацию о направлении на отдельной странице (данные из той же таблицы).

Собственно вопросы:
  • Какие должны быть контроллеры? Или всё писать в одном?
пишите в экшнах, логически объединяя в контроллеры
n.osenni писал(а): 2017.12.14, 12:20
  • Как быть с методами контроллера? В частности интересует ситуация с получением данных обо всех направлениях (для вывода карточек)
    и только для какого-то одного направления.
контроллер/экшн - для получения данных извне и отдачи обратно. Все выборки на основе полученных данных должны происходить в сервисном слое.
n.osenni писал(а): 2017.12.14, 12:20
  • Как быть с видами? Для карточек один вид? Для информации подробной о выбранном направлении другой? Или всё в одном виде с if/else
разные конечно. Почему не взять любую демку с гитхаба и не посмотреть как она сделана?
n.osenni писал(а): 2017.12.14, 12:20 Как быть?
проявить немного самостоятельности, и лишь после того как не поймете что-то при самостоятельном изучении, идти на форум.
Последний раз редактировалось zelenin 2017.12.14, 15:01, всего редактировалось 1 раз.
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Re: Структура контроллеров и методов витрины

Сообщение n.osenni »

zelenin писал(а): 2017.12.14, 14:58
n.osenni писал(а): 2017.12.14, 12:20 Учусь, разбираюсь. И когда начал разбирать создание витрины, возникли разные варианты реализации. А как правильнее - это хочу спросить у вас.

Тестовый проект-витрина отображает карточки направлений деятельности - directions (например, покраска, чистка, доставка и т.п.). Все виды деятельности с доп информацией хранятся в БД в таблице deriction: одна направление деятельности - одна строка. При клике на карточку следует вывести подробную информацию о направлении на отдельной странице (данные из той же таблицы).

Собственно вопросы:
  • Какие должны быть контроллеры? Или всё писать в одном?
пишите в экшнах, логически объединяя в контроллеры
Что значит логически и как это сделать?
zelenin писал(а): 2017.12.14, 14:58
n.osenni писал(а): 2017.12.14, 12:20
  • Как быть с методами контроллера? В частности интересует ситуация с получением данных обо всех направлениях (для вывода карточек)
    и только для какого-то одного направления.
контроллер/экшн - для получения данных извне и отдачи обратно. Все выборки на основе полученных данных должны происходить в сервисном слое.
Все выборки на основе полученных данных должны происходить в сервисном слое
Поясните, пожалуйста.
zelenin писал(а): 2017.12.14, 14:58
n.osenni писал(а): 2017.12.14, 12:20
  • Как быть с видами? Для карточек один вид? Для информации подробной о выбранном направлении другой? Или всё в одном виде с if/else
разные конечно. Почему не взять любую демку с гитхаба и не посмотреть как она сделана?
n.osenni писал(а): 2017.12.14, 12:20 Как быть?
проявить немного самостоятельности, и лишь после того как не поймете что-то при самостоятельном изучении, идти на форум.
Порекомендуете какую-нибудь толковую демку по теме?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Структура контроллеров и методов витрины

Сообщение Nex-Otaku »

В стандартном приложении уже есть и контроллеры, и вьюшки, и странички. Смотрите, как сделано, и делаете примерно так же.
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Re: Структура контроллеров и методов витрины

Сообщение n.osenni »

Nex-Otaku писал(а): 2017.12.14, 17:25 В стандартном приложении уже есть и контроллеры, и вьюшки, и странички. Смотрите, как сделано, и делаете примерно так же.
Я знаю как их делать. Вопрос же вооооообще не в том. Неужели я что-то не так спрашиваю?

Есть таблица (фиг с ним - пуст будут товары) с товарами. Нужно вывести карточки товаров. И вывести информацию о товаре, если карточку товара открыли. Стандартно идёт один контроллер SiteController. Я все экшены и все методы должне описать там? Или же как-то должен поделить контроллеры. И если поделить, то как. Я хочу узнать подход к решению задачи. Как следует правильно реализовать описанную витрину с описанными возможностями. Понятно, что можно весь код в одном контроллере писать. Правильно ли это?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Структура контроллеров и методов витрины

Сообщение zelenin »

n.osenni писал(а): 2017.12.14, 17:33
Nex-Otaku писал(а): 2017.12.14, 17:25 В стандартном приложении уже есть и контроллеры, и вьюшки, и странички. Смотрите, как сделано, и делаете примерно так же.
Я знаю как их делать. Вопрос же вооооообще не в том. Неужели я что-то не так спрашиваю?

Есть таблица (фиг с ним - пуст будут товары) с товарами. Нужно вывести карточки товаров. И вывести информацию о товаре, если карточку товара открыли. Стандартно идёт один контроллер SiteController. Я все экшены и все методы должне описать там? Или же как-то должен поделить контроллеры. И если поделить, то как. Я хочу узнать подход к решению задачи. Как следует правильно реализовать описанную витрину с описанными возможностями. Понятно, что можно весь код в одном контроллере писать. Правильно ли это?
логически делите на разные контроллеры. по-моему все ясно.
вбиваете на гитхабе в поиск yii2 demo, yii2 shop, yii2 admin и смотрите.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Структура контроллеров и методов витрины

Сообщение caHek2x »

окей услуги ... services ...
контроллер
ServicesController.php
пусть public function actionIndex будет для просмотра всех услуг ...
public function actionView для просмотра доп инфо по услуге ..
что вы так заморочились ? не бойтесь создавать контроллеры ...
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Re: Структура контроллеров и методов витрины

Сообщение n.osenni »

caHek2x писал(а): 2017.12.14, 17:56 окей услуги ... services ...
контроллер
ServicesController.php
пусть public function actionIndex будет для просмотра всех услуг ...
public function actionView для просмотра доп инфо по услуге ..
что вы так заморочились ? не бойтесь создавать контроллеры ...
Я решил разделить на два контроллера
SiteController - для обработки основных страниц сайта типа О сайте, главной страницы и т.п.
CatalogController - для работы с витриной: вывод карточек, отображение карточек и т.п.

Вопрос вот в чём. А где мне хранить общие для двух контроллеров методы? Например, у меня есть методы, которые работают с фотографиями, автоматически подхватывающие их нужного размера из определённых папок (для товара с id 4 фото лежат в одноимённой папке). Создать один общий какой-то контроллер (GeneralController, например, от которого потом наследовать все остальные? Но где обозначается точка входа? Т.е что SiteController - первичный контроллер, который должен обработать запрос на отображение главной страницы сайта, например?

Как правильно поступить тут?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Структура контроллеров и методов витрины

Сообщение caHek2x »

смотря что за методы ... если это методы модели то в модели (хотя ктото это считает неприемлимым) тогда можно вынести в компонент ... все зависит от задачи ...
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Структура контроллеров и методов витрины

Сообщение Nex-Otaku »

Я решил разделить на два контроллера
SiteController - для обработки основных страниц сайта типа О сайте, главной страницы и т.п.
CatalogController - для работы с витриной: вывод карточек, отображение карточек и т.п.
Нормальное разделение. Вообще так в основном: какая-то область сайта (например, каталог товаров или блог) выделяется в отдельный контроллер, потом для каждого типа странички в этой области, создаётся действие.

Пример:
BlogController // Блог
--> actionIndexPosts // Все записи
--> actionViewCategory // Рубрика
--> actionViewPost // Отдельная запись

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

Базовые классы для контроллеров лучше не создавать.
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Re: Структура контроллеров и методов витрины

Сообщение n.osenni »

Спасибо большое! я понял.
Nex-Otaku писал(а): 2017.12.15, 13:48 Выносишь в отдельный класс и вызываешь его метод из контроллера.
Базовые классы для контроллеров лучше не создавать.
Я создал главный класс, от которого наследую остальные. В этом главном классе конструктор, который загружает настройки сайта и т.п.
Почему так лучше не делать?

Если делать просто отдельный класс без наследования остальных от него, то где его размещать и как именовать. Ко всем контроллерам его пихать в папку controller?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Структура контроллеров и методов витрины

Сообщение caHek2x »

а почему настройки не вынести в компонент ?и потом например Yii::$app->setting->
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Структура контроллеров и методов витрины

Сообщение Nex-Otaku »

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

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

Наследование хорошая штука, но его стоит использовать только тогда, когда ты точно знаешь, почему решаешь задачу именно наследованием. Если же не уверен, что это лучший вариант, то лучше его не применять. Код будет гибче и понятнее.
Если делать просто отдельный класс без наследования остальных от него, то где его размещать и как именовать. Ко всем контроллерам его пихать в папку controller?
Ну, например, создать папку /common/helpers и назвать класс PhotoHelper. В целом, как тебе удобно, так и строишь структуру папок.
Ответить