Как выстроить правильную структуру контроллера YII2?
Всем привет!
Такой вопрос. Реализовываю проект на yii2 и собсна появилась неудивительная необходимость создавать вложенные пути страниц. К примеру /settings/user/data/info или /settings/user/data где по логике своей контроллер это settings.
Я на данный момент делаю так, через роутинг настроил чтобы всегда в ДАННОМ случае переадресовывалось на контроллер settings и в него передавались параметры где user это $url, data это $cat, info это $cat2.
И в контроллере уже через условия определяю откуда пришло и куда отправлять.... Так то вроде все классно, но как-то меня это смущает)
Правильно ли я делаю в данном случае или нет? Как вообще при различной вложенности выстраивать работу в контроллере?
Создан контроллер Settings и в нем есть action с названием user (actionUser). А вот далее я пока не понял (изучаю что вы скинули), как далее выстраивать алгоритм экшенов с учетом вложенности. У меня в экшине user передаются параметры $url и $req где из моего примера выше $url это data а $req это info.
В моем примере это получается так:
function actionUser($url,$req) {
if($url=='data') {
....
} elseif($url==.....)
.....
}
Я так понимаю что в конфиге мне надо создать нечто подобное:
Константин Марченко, возможно и так, а может и не так.
Из Вашего вопроса вообще непонятно, почему именно такие маршруты получаются.
Вот это только лишняя путаница, трудная поддержка и ещё куча всего плохого.
function actionUser($url,$req) {
if($url=='data') {
....
} elseif($url==.....)
.....
}
Константин Марченко, добавьте в вопрос описание работы Вашего приложения.
Зачем, например, такой маршрут? /settings/user/data/info
Контроллер Settings за что отвечает?
Что значит в маршруте user, data и info?
Дмитрий, Ну смотрите. Если говорить языком сайта, то settings это раздел в котором есть подраздел user в котором собственно тоже есть подраздел data, последний info это я уже так, для примера дописал). Вот отсюда и получается такая цепочка. Я ее естественно и пытался выстроить как дерево что в принципе и логично. Но не понимаю как в данном случае если у тебя settings это контроллер а user это action, то дальнейшую вложенность (data) как выстраивать ?
Вы пишите "Одно действие -> один вид.". Исходя из этого я понял что должно быть так:
Дмитрий, Ну если говорить в данном разделе и если я правильно вас понял, то пока что там просто вывод различной информации о юзере и подразделами для редактирования данных юзера. Раздел Data это его паспортные данные, полное ФИО, адрес проживания и т.д. Далее в разделе Profile это параметры к примеру Изображение авы, ник, описание там и .т.д. Profile это раздел который стоит на уровне data, тоесть settings/user/profile.
Давайте задам вопрос по другому, при пути settings/user/data или еще глубже settings/user/profile/image - settings это контроллер а остальные параметры это отдельные action?
Константин Марченко, если Вы хотите редактировать данные пользователя, то settings не имеет к этому никакого отношения. В данном случае settings может отвечать за настройки самого сайта, но не пользователя. Пользователем должен заниматься только User модель и UserController.
И, User занимается регистрационными данными, а вот для профиля создать отдельный контроллер, назвать его ProfileController. Через него редактировать паспортные данные, аватару и прочее.
Смотрите всё по ссылкам выше. Так же читайте статьи на блоге, ссылку я также дал выше(статьи с тегом Yii2)
Дмитрий, Да это понятно что всеми параметрами связанным с юзером должен заниматься юзер контроллер, он есть у меня. Я спрашиваю не про это. А про то, как технически выстроить цепочку вложенности. Я может не правильно мысль преподношу или пример сложный. Давайте на другом простом примере. Вот есть сайт стран городов, регионов и т.д. Вот вы зашли на сайт, зашли в категорию Страны, далее перешли в категорию, Города, далее перешли в категорию, Регионы, потом перешли в Районы и только потом перешли в раздел Улицы. Тоесть вот такой вот длинный путь будет у пути урл:
country/city/region/raion/street
Вот на этом примере у нас получается что country это контроллер а city, region, raion и street это отдельные action в контроллере country? верно?
Константин Марченко, блог найдёте по ссылке "Два", начните с него. Потом мастер- класс по ООП и мастер- класс по созданию магазина. Не забудьте ознакомиться с основами ООП в официальной документации по php.
можно как вы предложили - но, имейте ввиду что появись у вас с десяток экшенов вы наврядли сможете быстро править/модернизировать код или искать ошибку в случае чего (просто потому что на поиск правильного экшена у вас уйдет нормльно так времени).
можно разделять по контроллерам. но опять же - слишком много контроллеров и получится неплохой такой монолит. Но это если у вас вложенность экшенов не большая (setting/user/id)
а можно как предложил товарищ выше - организовать все по модулям. как по мне самый правильный вариант.
данную структуру что вы описали можно использовать когда у вас всего 3-4 экшена и в них не долго разобраться. а в основном лучше через модули (если экшенов и контроллеров много)
Видимо придется всётаки через модули....
Я бы просто не сказал бы что у меня там сложный раздел, просто уровней вложенности прилично.
Ладно, спасибо за инфу!
Константин Марченко, старайтесь не делать супер контроллеров, на тысяси строк, и всё у вас получится) если контроллер содержит много строк щначит в нем что то не так, возьмите за правило, для начала, не более 400-500.
vitaly_74, Такой вопрос, если у меня идет разделение на сайте на юридические лица и физические. Тоесть, если залогинился физ лицо, его направляется на /phys/.... , если залогинился юр лицо, то его направляет на путь /legal/....
если говорить моим выше написанным примером, то у физ лица настройки будут по пути /phys/settings а у юр лица /legal/settings
Да и в принципе все действия у каждого будет через свою приставку legal или phys. Могу ли я разделить модули таким образом:
создаю модуль по пути app\modules\phys\settings\Module
а в роутинге к примеру пропишу что-то подобное:
Константин Марченко, емли у вас функционал капитально отличается друг от друга. то создайте 2 модуля и в модулях создавайте контроллеры.
если функционал не слишком отличается то создайте один модуль, личного кабинета (или что у вас там)
и добавьте пользователю роль юр. лица или роль физика. или прям в бд сохраняйте тип полтщователя и затем проверяйте каждый раз когда надо.
модуль в модуле - крайне редко встречал. уверен в вашем случае этого не нужно. поэтому не создавайте модуль в модуле)
Знаком с модулями, не оч хочется таким образом....
Константин Марченко, посмотрите этот мастер-класс, очень много интересного узнаете, как раз о правильном подходе.
Правда перед этим надо ознакомиться с основами ООП и посмотреть вот этот мастер-класс от того же автора.
Еще только учусь, но..
Кажется пути настраиваются в правилах UrlManager-а.
Нужно покурить про него и создать правила в соответствии с Вашими нуждами.
Ну и всегда можно сделать кучу контроллеров включая вложенные директории и пути соответственно изменятся без правил урл менеджера