Yii2: изменения в работе с URL
11 марта 2014
Буквально несколько минут назад смёржил ветку с изменениями в работе с URL в основной репозиторий Yii2.
Добавлен новый хелпер yii\helpers\Url
и убраны:
yii\heplers\Html::url
. Вместо негоyii\helpers\Url::to
.yii\web\Controller::createUrl
иyii\web\Controller::createAbsoluteUrl
. Вместо нихyii\helpers\Url::toRoute
.yii\web\Controller::getCanonicalUrl
. Вместо негоyii\helpers\Url::canonical
.
Пользоваться новым хелпером можно так:
use yii\helpers\Url; echo Url::to(''); // текущий URL echo Url::toRoute(['view', 'id' => 'contact']); // тот же контроллер, другой экшн echo Url::toRoute('post/index'); // тот же модуль, другие контроллер и экшн echo Url::toRoute('/site/index'); // абсолютный роут вне зависимости от текущего контроллера echo Url::toRoute('hi-tech'); // URL для экшна в с регистрозависимым именем `actionHiTech` текущего контроллера echo Url::toRoute(['/date-time/fast-forward', 'id' => 105]); // URL для регистрозависимых экшна и контроллера `DateTimeController::actionFastForward` echo Url::to('@web'); // получаем URL из алиаса echo Url::canonical(); // получаем canonical URL для текущей страницы echo Url::home(); // получаем домашний URL Url::remember(); // сохраняем URL для последующего использования Url::previous(); // получаем ранее сохранённый URL
Комментарии RSS по email OK
Неплохо)
Исправьте yii\helpers::toRoute на yii\helpers\Url::toRoute и далее по тексту
Очень логичное разделение и очень правильное!
Я правильно понял, что:
echo Url::toRoute(['/dateTime/fastForward', 'id' => 105]);
Не будет работать?
Круто, действительно немного смущало и путало разнообразие "способов" получить Url.
xoma, да.
Подскажите, есть ли возможность (может планируется?) в Yii2 прописывать свои маршруты в модулях, а в основном файле настроек централизовано подключать их, как это сделано например в symfony или django?
2Алексей Поидее да, добавив bootstrap инициализатор в свой экстеншн. А там уже добавлять rules в УрлМэнеджер. Я пока не знаю примеров таких расширений, но здесь написано как это сделать github.com/yiisoft/yii2-composer
Названия стали куда логичнее, но хочется сказать "шо опять???" надо будет весь проект прочесывать
Алексей, вот состояние задачи про модули и роуты github.com/yiisoft/yii2/issues/810
Serge Bezborodov, ну что поделать... пререлиз же.
Евгений, Алексей спасибо, посмотрю.
xoma, а почему оно работать не будет?
Артур, потому что внутренний роутинг использует
date-time/fast-forward
, а неdateTime/fastForward
.Здравствуйте, Александр!
Можно ли принимать участие в разработке/улучшении yii2, помочь быстрее релизнутся? Если можно, то что для этого нужно сделать?
Кстати, при возможности исправьте ошибку: github.com/yiisoft/yii2-gii/blob/master/generators/extension/templates/composer.json
Serge Bezborodov, в отличии от модификации работы scope в ActiveRecord адаптация проекта у меня заняла 5 минут поиск createUrl + замена.
Dmitry Khaperets, да, конечно. Код принимается в виде pull-request.
Dmitry Khaperest, вот так можно помочь: github.com/yiisoft/yii2/blob/master/docs/internals/git-workflow.md
Почему Url::to ? Url::from был бы более логичным вариантом.
Url всегда указывает на что-то.
Получаем url из, т.е from.
То же самое и для:
получить url из роута.
ИМХО, "to" больше подходит как метод для преобразования или конвертирования без входного параметра:
или
Старые методы убираются из кода или становятся deprecated?
Когда будет релиз, будут deprecat'иться. А сейчас удаляются.
Спасибо!
Жаль что в новых методах логики стало меньше
Кстати предложенный вариант
Url::Create () ; Url::createAbsolute () ; Url::createCanonical () ;
Мне больше понравился чем Url::to()
А когда будет бета? или там фича фриз, какой-нибудь? Что бы можно было начать использовать ветку 2, не боясь при очередном обновлении обрушить проект?
Скоро.
Sam, пробую перенести логику с yii на yii2, возникла проблема переносом роута
во втором подобная запись не работает, но работает
Как мне нужно записать роут чтобы функция get получала все все запросы начинающиееся с "/image/*" ?
Спасибо
'image/<id>'
Url::previous();
иUrl::remember();
как-то непонятно работают.пытался использовать так: запоминаю текущий урл в
afterAction
:далее в другом контроллере вызвав
Url::previous();
получается что угодно только не прошлый урл. Туда попадают ссылки на ресурсы обычно, причем разные, и неверные, например вот это последний раз было вUrl::previous();
:/var/www/html/web/fonts/fontawesome-webfont.svg?v=4.1.0
и, что примечательно, папки
/var/www/html/
у меня нету на компьютереПо этому поводу лучше на форум yiiframework.ru.
Скажите где все это добро нужно писать в контроллере или же в представлении?
2Денис, там, где Вам это нужно, очевидно. Подключаем хелпер и все.
Работает везде.
Мне необходимо создать url на внешний сайт с определенными параметрами (например site.ru?param1=one¶m2=two). Существующий метод не подходит для этого.
Нужно что-то похожее на метод current, только для внешних урлов. Есть какие-то идеи?
@Сергей я свой простой хелпер под такое написал, но есть и куча навороченных библиотек для работы c url
Добрый день! Искал искал, но не смог найти ответ на свой вопрос - вдруг найду его здесь :-)
Можно ли использовать в Url::to( ...) параметризированные роутеры для генерации правильной ссылки?
Например, в конфигурации urlManager: ... [ 'pattern' => '<controller:[a-zA-Z0-9_-]+>/<action:[a-zA-Z0-9_-]+>', 'route' => '/' ] ..
в коде при генерации ссылки пишу например вот такое:
Url::to(['/', 'controller' => 'account', 'action' => 'create'])
выдает совсем не то что ожидаю:
/<action??controller=account&action=create а теоретически должно вернуть вот такое: account/create
Хотя, если в описании параметра route не используются угловые скобки < , > то ссылка генерируется верно. Заранее спасибо :-)
ой .. прошу прощение .. чуть обрезало сообщение! При вызове Url::to() в качестве первого параметра передаем не /, а значение параметра route вместе с фигурными скобками
'route' = ' <controller>/<action>'
Нет, такое фреймворком не поддерживается.
В документации используются Url::to, а вот видео Текст ссылки
Добрый день. У меня небольшая проблема с Url::toRoute(), на главной странице ссылка генерица нормально ( afisha/category/id-title ), на внутренней генерится как GET параметры ( /afisha/event?category=concert&id=5&title=qeqwr ).
Строка формирования url одинаковая: Url::toRoute( ['afisha/event', 'category' => $v['url'], 'id' => $v['id'], 'title' => $v['o_title']]);
В чем может быть проблема?
Модули?
Модулей нет. Я разобрался. Забавная штука получилась.
На главной работает нор, а на внутренних не работало( но если убрать последнее правило[которое стандартное], то начинает работать и во внутренних страницах ). В итоге сделал: