YiiFramework Yii2: изменения в работе с URL

MiksIr

miksir@home:~$
У меня есть фронт-ендеры, которые работают с шаблоном. Вот у них частая ошибка - писать /site/index вместо site/index. Когда контроллер и экшен мапятся из урла 1 в 1 - она в работе незаметна. Но стоит что-то начать менять в менеджере урлов - начинаем выискивать проблемы.
Т.е. не нравится, что совершенно одинаковый синтаксис и для обычного урла и для конструирования урла.
 
Последнее редактирование:

MiksIr

miksir@home:~$
А, понял, недочитал подсказку про Url::toRoute('/site/index'), это хорошо... правда все-равно непонятно.
Чем site/index отличается от /site/index
 

MiksIr

miksir@home:~$
А, ну да, туплю, подсказка сбила с мысли просто "абсолютный роут вне зависимости от текущего контроллера" - наверно имелось ввиду вне зависимости от текущего модуля?
 

Sam Dark

Новичок
И контроллера тоже. /site/index будет всегда указывать на SiteController::actionIndex откуда бы мы его не использовали.
 

MiksIr

miksir@home:~$
Ну без слеша тоже укажет, если модуля нет, так что разница только в наличии модуля, это и смутило.
А в чем причина особого синтаксиса для регистозависимого синтаксиса?
 

MiksIr

miksir@home:~$
Соглашение откуда-то из других мест пришло?
Иначе зачем в случае SiteController::actionSomeAction писать site/some-action, а не site/someAction, все же последнее очевиднее.
 

Sam Dark

Новичок
Когда принимали соглашение исходили из того, что в URL не должно быть капса. Для единообразия приняли и отсутствие капса в роутах.

Для того же SiteTestController::actionDoIt роут в 1.1 был siteTest/doIt. S и D стали s и d, так что прямого соответствия и ранее не было.
 

MiksIr

miksir@home:~$
Ага, но это не повод для гордости ;) Но это могло создать проблемы только для имен модулей, а остальное, т.е. SiteTest/Dolt работает без проблем, ибо для контроллера делается ucfirst так или иначе, а методы у нас вообще регистронезависимы.
 

MiksIr

miksir@home:~$
Проблемы насколько я понимаю создавало то, что SiteTest/Dolt мапился в SiteTest/Dolt, а siteTest/dolt в siteTest/dolt несмотря на то, что это один и тот же роут, вне зависимости от настроек caseSensitive.

Сейчас, как я понимаю, предполагается, что метод SiteController::actionDoSome будет иметь URI site/do-some, а SiteController::actionDosome - будет site/dosome?
 
  • Like
Реакции: AmdY

MiksIr

miksir@home:~$
Что в общем те же грабли, разве что более очевидные. Если у нас задача - однозначно отмапить регистро-зависимый URI в регистро-независимое название класса/метода и обратно, то зачем разделять поведение в зависимости от регистра регистро-независимого источника?

Тут или мапить все принудительно в нижний регистр, т.е. actionDoSoME будет все-равно dosome. Или рефлексией проверять совпадение регистра элемента URI и метода/класса. Или и то и другое опционально. Единственная проблема если мапить в нижний регистр - это поиск файла класса/модуля.

А черточки по сути ничего не решают без той же проверки регистра рефлексией. Сеошники ведь чего боятся - что по разным с точки зрения поисковых систем URL будет один и тот же контент.
 

Sam Dark

Новичок
Нет там никакой рефлексии. Медленная она и в этом случае не нужна. Мы мапим принудительно в нижний с разделителями.

В 1.1 работали URI вида /sItE/InDEx одновременно с /site/index. Для сеошников это катастрофа. Так что источник нужен как раз регистрозависимый.
 

Sam Dark

Новичок
Это для 404 нормальной. Похоже я забыл как оно реализовано и что рефлексия имеется :) Спасибо за напоминание.

Canonical решает проблему, да. Вот только его надо строить правильно, включая нужное и выкидывая ненужное.
 
Сверху