<rmcreative>

RSS

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

  1. №8846
    Иван
    Иван 11 марта 2014 г., 8:08:48

    Неплохо)

  2. №8847
    Алексей
    Алексей 11 марта 2014 г., 8:57:41

    Исправьте yii\helpers::toRoute на yii\helpers\Url::toRoute и далее по тексту

  3. №8848
    xoma
    xoma 11 марта 2014 г., 13:22:32

    Очень логичное разделение и очень правильное!

  4. №8849
    xoma
    xoma 11 марта 2014 г., 13:34:18

    Я правильно понял, что:

    echo Url::toRoute(['/dateTime/fastForward', 'id' => 105]);

    Не будет работать?

  5. №8850
    Евгений
    Евгений 11 марта 2014 г., 13:49:30

    Круто, действительно немного смущало и путало разнообразие "способов" получить Url.

  6. №8851
    Sam
    Sam 11 марта 2014 г., 14:01:30

    xoma, да.

  7. №8852
    Алексей
    Алексей 11 марта 2014 г., 14:30:08

    Подскажите, есть ли возможность (может планируется?) в Yii2 прописывать свои маршруты в модулях, а в основном файле настроек централизовано подключать их, как это сделано например в symfony или django?

  8. №8853
    Евгений
    Евгений 11 марта 2014 г., 14:52:33

    2Алексей Поидее да, добавив bootstrap инициализатор в свой экстеншн. А там уже добавлять rules в УрлМэнеджер. Я пока не знаю примеров таких расширений, но здесь написано как это сделать github.com/yiisoft/yii2-composer

    You may specify a bootstrap class in the extra section. The init() method of the class will be executed each time the Yii 2 application is responding to a request. For example, { "type": "yii2-extension", ..., "extra": { "bootstrap": "yii\jui\Extension" } }

  9. №8854
    Serge Bezborodov
    Serge Bezborodov 11 марта 2014 г., 15:04:37

    Названия стали куда логичнее, но хочется сказать "шо опять???" надо будет весь проект прочесывать

  10. №8855
    Алексей
    Алексей 11 марта 2014 г., 15:18:13

    Алексей, вот состояние задачи про модули и роуты github.com/yiisoft/yii2/issues/810

  11. №8856
    Sam
    Sam 11 марта 2014 г., 15:29:05

    Serge Bezborodov, ну что поделать... пререлиз же.

  12. №8857
    Алексей
    Алексей 11 марта 2014 г., 16:12:36

    Евгений, Алексей спасибо, посмотрю.

  13. №8858
    Артур
    Артур 11 марта 2014 г., 17:37:25

    xoma, а почему оно работать не будет?

  14. №8859
    Sam
    Sam 11 марта 2014 г., 21:06:42

    Артур, потому что внутренний роутинг использует date-time/fast-forward, а не dateTime/fastForward.

  15. №8860
    Dmitry Khaperets
    Dmitry Khaperets 12 марта 2014 г., 0:32:25

    Здравствуйте, Александр!

    Можно ли принимать участие в разработке/улучшении yii2, помочь быстрее релизнутся? Если можно, то что для этого нужно сделать?

    Кстати, при возможности исправьте ошибку: github.com/yiisoft/yii2-gii/blob/master/generators/extension/templates/composer.json

  16. №8861
    Pavimus
    Pavimus 12 марта 2014 г., 0:37:40

    Serge Bezborodov, в отличии от модификации работы scope в ActiveRecord адаптация проекта у меня заняла 5 минут поиск createUrl + замена.

  17. №8862
    Sam
    Sam 12 марта 2014 г., 1:55:20

    Dmitry Khaperets, да, конечно. Код принимается в виде pull-request.

  18. №8863
    Алексей
    Алексей 12 марта 2014 г., 14:28:23

    Dmitry Khaperest, вот так можно помочь: github.com/yiisoft/yii2/blob/master/docs/internals/git-workflow.md

  19. №8864
    Silentium
    Silentium 12 марта 2014 г., 20:10:07

    Почему Url::to ? Url::from был бы более логичным вариантом.

  20. №8865
    Sam
    Sam 12 марта 2014 г., 23:08:06

    Url всегда указывает на что-то.

  21. №8866
    Silentium
    Silentium 13 марта 2014 г., 9:36:39
    echo Url::to('@web'); // получаем URL из алиаса

    Получаем url из, т.е from.

    То же самое и для:

    echo Url::toRoute('/site/index');

    получить url из роута.

    ИМХО, "to" больше подходит как метод для преобразования или конвертирования без входного параметра:

    (new Url('site/index'))->toRoute();
     
    Url::from('index.php?r=site/index')->toRoute();

    или

    Url::routeToUrl('site/index');
  22. №8867
    Александр
    Александр 13 марта 2014 г., 10:50:17

    Старые методы убираются из кода или становятся deprecated?

  23. №8868
    Алексей
    Алексей 13 марта 2014 г., 12:51:53

    Когда будет релиз, будут deprecat'иться. А сейчас удаляются.

  24. №8877
    Александр
    Александр 15 марта 2014 г., 10:27:21

    Спасибо!

  25. №8878
    Mirocow
    Mirocow 16 марта 2014 г., 0:04:05

    Жаль что в новых методах логики стало меньше

  26. №8879
    Mirocow
    Mirocow 16 марта 2014 г., 2:05:16

    Кстати предложенный вариант

    Url::Create () ; Url::createAbsolute () ; Url::createCanonical () ;

    Мне больше понравился чем Url::to()

  27. №8906
    porcelanosa
    porcelanosa 25 марта 2014 г., 13:29:16

    А когда будет бета? или там фича фриз, какой-нибудь? Что бы можно было начать использовать ветку 2, не боясь при очередном обновлении обрушить проект?

  28. №8907
    Sam
    Sam 25 марта 2014 г., 13:37:34

    Скоро.

  29. №9246
    gregman
    gregman 02 окт. 2014 г., 17:51:11

    Sam, пробую перенести логику с yii на yii2, возникла проблема переносом роута

    // код yii
    'urlManager'=>array(
                'urlFormat'      =>'path',
                'showScriptName' => false,
                'caseSensitive'  => true,
                'rules' => array(
                      'image/<id:\d+>*'   => array('image/get'),
                             )
                           )

    во втором подобная запись не работает, но работает

    //yii2 работает с одним аргументом
    'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => [
                         'image/<id:\d+>'   => ['image/get'],
                ]
    ]

    Как мне нужно записать роут чтобы функция get получала все все запросы начинающиееся с "/image/*" ?

    Спасибо

  30. №9247
    Sam
    Sam 02 окт. 2014 г., 18:54:12

    'image/<id>'

  31. №9259
    DeviD
    DeviD 07 окт. 2014 г., 16:24:51

    Url::previous(); и Url::remember(); как-то непонятно работают.

    пытался использовать так: запоминаю текущий урл в afterAction:

    If this parameter is not specified, the currently requested URL will be used.

    public function afterAction($action, $result) {
        $result = parent::afterAction($action, $result);
     
        Url::remember();
     
        return $result;
    }

    далее в другом контроллере вызвав Url::previous(); получается что угодно только не прошлый урл. Туда попадают ссылки на ресурсы обычно, причем разные, и неверные, например вот это последний раз было в Url::previous(); : /var/www/html/web/fonts/fontawesome-webfont.svg?v=4.1.0

    и, что примечательно, папки /var/www/html/ у меня нету на компьютере

  32. №9265
    Sam
    Sam 08 окт. 2014 г., 0:35:01

    По этому поводу лучше на форум yiiframework.ru.

  33. №9572
    Денис
    Денис 14 янв. 2015 г., 12:29:30

    Скажите где все это добро нужно писать в контроллере или же в представлении?

  34. №9581
    Ivan
    Ivan 16 янв. 2015 г., 12:17:13

    2Денис, там, где Вам это нужно, очевидно. Подключаем хелпер и все.

    use yii\helpers\Url;

    Работает везде.

  35. №9690
    Сергей
    Сергей 13 марта 2015 г., 15:05:34

    Мне необходимо создать url на внешний сайт с определенными параметрами (например site.ru?param1=one&param2=two). Существующий метод не подходит для этого.

    echo Url::to('@web'); // получаем URL из алиаса

    Нужно что-то похожее на метод current, только для внешних урлов. Есть какие-то идеи?

  36. №9691
    Serge Bezborodov
    Serge Bezborodov 15 марта 2015 г., 11:19:48

    @Сергей я свой простой хелпер под такое написал, но есть и куча навороченных библиотек для работы c url

  37. №9723
    Алексей
    Алексей 30 марта 2015 г., 13:32:22

    Добрый день! Искал искал, но не смог найти ответ на свой вопрос - вдруг найду его здесь :-)

    Можно ли использовать в 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 не используются угловые скобки < , > то ссылка генерируется верно. Заранее спасибо :-)

  38. №9724
    Алексей
    Алексей 30 марта 2015 г., 13:35:11

    ой .. прошу прощение .. чуть обрезало сообщение! При вызове Url::to() в качестве первого параметра передаем не /, а значение параметра route вместе с фигурными скобками

  39. №9725
    Алексей
    Алексей 30 марта 2015 г., 13:41:59

    'route' = ' <controller>/<action>'

  40. №9726
    Sam
    Sam 30 марта 2015 г., 18:14:14

    Нет, такое фреймворком не поддерживается.

  41. №9766
    Владимир
    Владимир 20 апр. 2015 г., 7:55:10

    В документации используются Url::to, а вот видео Текст ссылки

  42. №10259
    Артем
    Артем 16 февр. 2016 г., 13:27:37

    Добрый день. У меня небольшая проблема с 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']]);

    В чем может быть проблема?

  43. №10261
    Sam
    Sam 16 февр. 2016 г., 18:35:56

    Модули?

  44. №10263
    Артем
    Артем 17 февр. 2016 г., 11:19:20

    Модулей нет. Я разобрался. Забавная штука получилась.

    'rules' => array(
                    '/' => 'site/index',
                    'afisha/<category:\w+>' => 'afisha/category',
                    'afisha/<category:\w+>/<id:\d+>-<title:\w+>' => 'afisha/event',
                    'afisha/<category:\w+>/<page:\d+>' => 'afisha/category',
                    '<controller>/<action>' => '<controller>/<action>',
                )

    На главной работает нор, а на внутренних не работало( но если убрать последнее правило[которое стандартное], то начинает работать и во внутренних страницах ). В итоге сделал:

    'afisha/<category>' => 'afisha/category',
                    'afisha/<category>/<id>-<title>' => 'afisha/event',
                    'afisha/<category>/<page>' => 'afisha/category',
                    '<controller>/<action>' => '<controller>/<action>',
  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.