2 关注者

Url 助手

Url 助手提供了一组用于管理 URL 的静态方法。

获取常用 URL

您可以使用两种方法获取常用 URL:首页 URL 和当前请求的基 URL。要获取首页 URL,请使用以下方法

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

如果未传递参数,则生成的 URL 为相对 URL。您可以传递 true 以获取当前方案的绝对 URL,或者显式指定方案(httpshttp)。

要获取当前请求的基 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 指定其他查询参数,也可以使用数组。数组格式必须为

// generates: /index.php?r=site%2Findex&param1=value1&param2=value2
['site/index', 'param1' => 'value1', 'param2' => 'value2']

如果您想创建带有锚点的 URL,可以使用带有 # 参数的数组格式。例如:

// generates: /index.php?r=site%2Findex&param1=value1#name
['site/index', 'param1' => 'value1', '#' => 'name']

路由可以是绝对的,也可以是相对的。绝对路由以斜杠开头(例如 /site/index),而相对路由则没有斜杠(例如 site/indexindex)。相对路由将根据以下规则转换为绝对路由

  • 如果路由为空字符串,则将使用当前 路由
  • 如果路由根本不包含斜杠(例如 index),则它被视为当前控制器的操作 ID,并将使用 yii\web\Controller::$uniqueId 作为前缀;
  • 如果路由没有斜杠开头(例如 site/index),则它被视为相对于当前模块的路由,并将使用模块的 uniqueId 作为前缀。

从版本 2.0.2 开始,您可以使用 别名 指定路由。如果是这种情况,别名将首先转换为实际路由,然后根据上述规则将其转换为绝对路由。

以下是使用此方法的一些示例

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

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

// /index.php?r=post%2Fedit&id=100     assume the alias "@postEdit" is defined as "post/edit"
echo Url::toRoute(['@postEdit', 'id' => 100]);

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

// https://www.example.com/index.php?r=site%2Findex
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已经是绝对 URL,则其方案将被替换为指定的方案。

以下是一些使用示例

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

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

// /index.php?r=post%2Fedit&id=100     assume the alias "@postEdit" is defined as "post/edit"
echo Url::to(['@postEdit', 'id' => 100]);

// the currently requested URL
echo Url::to();

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

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

// https://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()根据当前请求的路由和 GET 参数创建 URL。您可以通过将$params参数传递给该方法来修改或删除一些 GET 参数或添加新参数。例如,

// assume $_GET = ['id' => 123, 'src' => 'google'], current route is "post/view"

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

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

记住 URL

在某些情况下,您需要记住 URL,然后在处理一系列请求中的其中一个请求时使用它。可以通过以下方式实现

// Remember current URL 
Url::remember();

// Remember URL specified. See Url::to() for argument format.
Url::remember(['product/view', 'id' => 42]);

// Remember URL specified with a name given
Url::remember(['product/view', 'id' => 42], 'product');

在下一个请求中,我们可以通过以下方式获取记住的 URL

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

检查相对 URL

要确定 URL 是否为相对 URL(即它没有主机信息部分),您可以使用以下代码

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

发现错别字或您认为此页面需要改进?
在 github 上编辑它 !