# Url ¶

Хелпер Url предоставляет набор статических методов для управления URL.

## Получение общих URL ¶

Вы можете использовать два метода получения общих URL: домашний URL (Home) и базовый URL (Base) текущего запроса. Используйте следующий код, чтобы получить домашний URL:

    $relativeHomeUrl = Url::home();
    $absoluteHomeUrl = Url::home(true);
    $httpsAbsoluteHomeUrl = Url::home('https');

Если вы не передали параметров, то получите относительный URL. Вы можете передать `true`, чтобы получить абсолютный URL для текущего протокола или явно указать протокол (`https`, `http`).

Чтобы получить базовый URL текущего запроса:

    $relativeBaseUrl = Url::base();
    $absoluteBaseUrl = Url::base(true);
    $httpsAbsoluteBaseUrl = Url::base('https');

Единственный параметр данного метода работает так же как и `Url::home()`.

## Создание URL ¶

Чтобы создать URL для соответствующего роута, используйте метод `Url::toRoute()`. Метод использует yii\web\UrlManager. Для того чтобы создать URL:

    $url = Url::toRoute(['product/view', 'id' => 42]);

Вы можете задать роут строкой, например, `site/index`. А также вы можете использовать массив, если хотите задать дополнительные параметры запроса для URL. Формат массива должен быть следующим:

    // сгенерирует: /index.php?r=site/index&param1=value1&param2=value2
    ['site/index', 'param1' => 'value1', 'param2' => 'value2']

Если вы хотите создать URL с якорем, то вы можете использовать параметр массива с ключом `#`. Например:

    // сгенерирует: /index.php?r=site/index&param1=value1#name
    ['site/index', 'param1' => 'value1', '#' => 'name']

Роут может быть и абсолютным, и относительным. Абсолютный URL начинается со слеша (например, `/site/index`), относительный - без (например, `site/index` or `index`). Относительный URL будет сконвертирован в абсолютный по следующим правилам:

- Если роут пустая строка, то будет использовано текущее значение route;
- Если роут не содержит слешей (например, `index`), то он будет считаться экшеном текущего контроллера и будет определен с помощью yii\web\Controller::$uniqueId;
- Если роут начинается не со слеша (например, `site/index`), то он будет считаться относительным роутом текущего модуля и будет определен с помощью uniqueId.

Начиная с версии 2.0.2, вы можете задавать роуты с помощью псевдонимов. В этом случае сначала псевдоним будет сконвертирован в соответствующий роут, который будет преобразован в абсолютный в соответствии с вышеописанными правилами.

Примеры использования метода:

    // /index.php?r=site/index
    echo Url::toRoute('site/index');

    // /index.php?r=site/index&src=ref1#name
    echo Url::toRoute(['site/index', 'src' => 'ref1', '#' => 'name']);

    // /index.php?r=post/edit&id=100     псевдоним "@postEdit" задан как "post/edit"
    echo Url::toRoute(['@postEdit', 'id' => 100]);

    // http://www.example.com/index.php?r=site/index
    echo Url::toRoute('site/index', true);

    // https://www.example.com/index.php?r=site/index
    echo Url::toRoute('site/index', 'https');

Другой метод `Url::to()` очень похож на toRoute(). Единственное отличие: входным параметром должен быть массив. Если будет передана строка, то она будет воспринята как URL.

Первый аргумент может быть:

- массивом: будет вызван toRoute(), чтобы сгенерировать URL. Например: `['site/index']`, `['post/index', 'page' => 2]`. В разделе toRoute() подробно описано как задавать роут;
- Строка, начинающаяся с `@`, будет обработана как псевдоним. Будет возвращено соответствующее значение псевдонима;
- Пустая строка: вернет текущий URL;
- Обычная строка: вернет строку без изменений.

Когда у метода задан второй параметр `$scheme` (строка или `true`), то сгенерированный URL будет с протоколом (полученным из yii\web\UrlManager::$hostInfo). Если в `$url` указан протокол, то его значение будет заменено.

Пример использования:

    // /index.php?r=site/index
    echo Url::to(['site/index']);

    // /index.php?r=site/index&src=ref1#name
    echo Url::to(['site/index', 'src' => 'ref1', '#' => 'name']);

    // /index.php?r=post/edit&id=100     псевдоним "@postEdit" задан как "post/edit"
    echo Url::to(['@postEdit', 'id' => 100]);

    // Текущий URL
    echo Url::to();

    // /images/logo.gif
    echo Url::to('@web/images/logo.gif');

    // images/logo.gif
    echo Url::to('images/logo.gif');

    // http://www.example.com/images/logo.gif
    echo Url::to('@web/images/logo.gif', true);

    // https://www.example.com/images/logo.gif
    echo Url::to('@web/images/logo.gif', 'https');

Начиная с версии 2.0.3, вы можете использовать yii\helpers\Url::current(), чтобы создавать URL на основе текущего запрошенного роута и его GET-параметров. Вы можете изменить, удалить или добавить новые GET-параметры, передав в метод параметр `$params`. Например:

    // предположим $_GET = ['id' => 123, 'src' => 'google'], а текущий роут "post/view"

    // /index.php?r=post/view&id=123&src=google
    echo Url::current();

    // /index.php?r=post/view&id=123
    echo Url::current(['src' => null]);
    // /index.php?r=post/view&id=100&src=google
    echo Url::current(['id' => 100]);

## Запоминание URL ¶

Существуют задачи, когда вам необходимо запомнить URL и потом использовать его в процессе одного или нескольких последовательных запросов. Это может быть достигнуто следующим образом:

    // Запомнить текущий URL
    Url::remember();

    // Запомнить определенный URL. Входные параметры смотрите на примере Url::to().
    Url::remember(['product/view', 'id' => 42]);

    // Запомнить URL под определенным именем
    Url::remember(['product/view', 'id' => 42], 'product');

В следующем запросе мы можем получить сохраненный URL следующим образом:

    $url = Url::previous();
    $productUrl = Url::previous('product');

## Проверить относительность URL ¶

Чтобы проверить относительный URL или нет (например, если в нем не содержится информации о хосте), вы можете использовать следующий код:

    $isRelative = Url::isRelative('test/it');