On this page
Caution
The documentation you are viewing is for an older version of this component.
Switch to the latest (v3) version.
Helpers
Url
The URL view helper is used to create a string representation of the routes that
you define within your application. The syntax for the view helper is
$this->url($name, $params, $options, $reuseMatchedParameters), using the
following definitions for the helper arguments:
$name: The name of the route you want to output.$params: An array of parameters that is defined within the respective route configuration.$options: An array of options that will be used to create the URL.$reuseMatchedParams: A flag indicating if the currently matched route parameters should be used when generating the new URL.
Let's take a look at how this view helper is used in real-world applications.
Basic Usage
The following example shows a simple configuration for a news module. The route
is called news and it has two optional parameters called action and
id.
// In a configuration array (e.g. returned by some module's module.config.php)
'router' => [
'routes' => [
'news' => [
'type' => 'segment',
'options' => [
'route' => '/news[/:action][/:id]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
],
'defaults' => [
'controller' => 'news',
'action' => 'index',
],
],
],
],
],
First, let's use the view helper to create the output for the URL /news without any of the
optional parameters being used:
<a href="<?= $this->url('news'); ?>">News Index</a>
This will render the output:
<a href="/news">News Index</a>
Now let's assume we want to get a link to display the detail page of a single
news entry. For this task, the optional parameters action and id need to
have values assigned. This is how you do that:
<a href="<?= $this->url('news', ['action' => 'details', 'id' => 42]); ?>">
Details of News #42
</a>
This will render the output:
<a href="/news/details/42">News Index</a>
Query String Arguments
Most SEO experts agree that pagination parameters should not be part of the URL
path; for example, the following URL would be considered a bad practice:
/news/archive/page/13. Pagination is more correctly accomplished using a query
string arguments, such as /news/archive?page=13. To achieve this, you'll need
to make use of the $options argument from the view helper.
We will use the same route configuration as defined above:
// In a configuration array (e.g. returned by some module's module.config.php)
'router' => [
'routes' => [
'news' => [
'type' => 'segment',
'options' => [
'route' => '/news[/:action][/:id]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
],
'defaults' => [
'controller' => 'news',
'action' => 'index',
],
],
],
],
],
To generate query string arguments from the view helper, you need to assign them
as the third argument using the query key like this:
<?php
$url = $this->url(
'news',
['action' => 'archive'],
[
'query' => [
'page' => 13,
],
]
);
?>
<a href="<?= $url; ?>">News Archive Page #13</a>
The above code sample would output:
<a href="/news/archive?page=13">News Archive Page #13</a>
Fragments
Another possible entry within the $options array is the assignment of URL
fragments (typically used to link to in-page anchors), denoted with using the
fragment key. Let's assume we want to enter a link for users to directly jump
to the comment section of a details page:
<?php
$url = $this->url(
'news',
['action' => 'details', 'id' => 42],
[
'fragment' => 'comments',
]
);
?>
<a href="<?= $url; ?>">Comment Section of News #42</a>
The above code sample would output:
<a href="/news/details/42#comments">Comment Section of News #42</a>
You can use fragment and query options at the same time!
<?php
$url = $this->url(
'news',
['action' => 'details', 'id' => 42],
[
'query' => [
'commentPage' => 3,
],
'fragment' => 'comments',
]
);
?>
<a href="<?= $url; ?>">Comment Section of News #42</a>
The above code sample would output:
<a href="/news/details/42?commentPage=3#comments">Comment Section of News #42</a>
Fully Qualified Domain Name
Another possible entry within the $options array is to output a fully
qualified domain name (absolute URL), denoted using the force_canonical key:
<?php
$url = $this->url(
'news',
[],
[
'force_canonical' => true,
]
);
?>
<a href="<?= $url; ?>">News Index</a>
The above code sample would output:
<a href="http://www.example.com/news">News Index</a>
Reusing Matched Parameters
When you're on a route that has many parameters, often times it makes sense to
reuse currently matched parameters instead of assigning them explicitly. In this
case, the argument $reuseMatchedParams will come in handy.
As an example, we will imagine being on a detail page for our news route. We
want to display links to the edit and delete actions without having to
assign the ID again:
// Currently url /news/details/777
<a href="<?= $this->url('news', ['action' => 'edit'], null, true); ?>">Edit Me</a>
<a href="<?= $this->url('news', ['action' => 'delete'], null, true); ?>">Delete Me</a>
Notice the true argument in the fourth position. This tells the view helper to
use the matched id (777) when creating the new URL:
<a href="/news/edit/777">Edit Me</a>
<a href="/news/delete/777">Edit Me</a>
Shorthand
Due to the fact that reusing parameters is a use case that can happen when no
route options are set, the third argument for the URL view helper will be
checked against its type; when a boolean is passed, the helper uses it to set
the value of the $reuseMatchedParams flag:
$this->url('news', ['action' => 'archive'], null, true);
// is equal to
$this->url('news', ['action' => 'archive'], true);