Phalcon\Mvc\Url is the component responsible of generate URLs in a Phalcon application. It’s capable of produce independent URLs based on routes.
Depending of which directory of your document root your application is installed, it may have a base URI or not.
For example, if your document root is /var/www/htdocs and your application is installed in /var/www/htdocs/invo then your baseUri will be /invo/. If you are using a VirtualHost or your application is installed on the document root, then your baseUri is /. Execute the following code to know the base URI detected by Phalcon:
use Phalcon\Mvc\Url; $url = new Url(); echo $url->getBaseUri();
By default, Phalcon automatically may detect your baseUri, but if you want to increase the performance of your application is recommended setting up it manually:
use Phalcon\Mvc\Url;
$url = new Url();
// Setting a relative base URI
$url->setBaseUri("/invo/");
// Setting a full domain as base URI
$url->setBaseUri("//my.domain.com/");
// Setting a full domain as base URI
$url->setBaseUri("http://my.domain.com/my-app/");
Usually, this component must be registered in the Dependency Injector container, so you can set up it there:
use Phalcon\Mvc\Url;
$di->set(
"url",
function () {
$url = new Url();
$url->setBaseUri("/invo/");
return $url;
}
);
If you are using the Router with its default behavior. Your application is able to match routes based on the following pattern: /:controller/:action/:params. Accordingly it is easy to create routes that satisfy that pattern (or any other pattern defined in the router) passing a string to the method “get”:
<?php echo $url->get("products/save"); ?>
Note that isn’t necessary to prepend the base URI. If you have named routes you can easily change it creating it dynamically. For Example if you have the following route:
$router->add(
"/blog/{year}/{month}/{title}",
[
"controller" => "posts",
"action" => "show",
]
)->setName("show-post");
A URL can be generated in the following way:
// This produces: /blog/2015/01/some-blog-post
$url->get(
[
"for" => "show-post",
"year" => "2015",
"month" => "01",
"title" => "some-blog-post",
]
);
You can use this component also to create URLs without mod_rewrite:
use Phalcon\Mvc\Url;
$url = new Url();
// Pass the URI in $_GET["_url"]
$url->setBaseUri("/invo/index.php?_url=/");
// This produce: /invo/index.php?_url=/products/save
echo $url->get("products/save");
You can also use $_SERVER["REQUEST_URI"]:
use Phalcon\Mvc\Url;
$url = new Url();
// Pass the URI in $_GET["_url"]
$url->setBaseUri("/invo/index.php?_url=/");
// Pass the URI using $_SERVER["REQUEST_URI"]
$url->setBaseUri("/invo/index.php/");
In this case, it’s necessary to manually handle the required URI in the Router:
use Phalcon\Mvc\Router; $router = new Router(); // ... Define routes $uri = str_replace($_SERVER["SCRIPT_NAME"], "", $_SERVER["REQUEST_URI"]); $router->handle($uri);
The produced routes would look like:
// This produce: /invo/index.php/products/save
echo $url->get("products/save");
The function “url” is available in volt to generate URLs using this component:
<a href="{{ url("posts/edit/1002") }}">Edit</a>
Generate static routes:
<link rel="stylesheet" href="{{ static_url("css/style.css") }}" type="text/css" />
This component allow you to set up a different base URI for static resources in the application:
use Phalcon\Mvc\Url;
$url = new Url();
// Dynamic URIs are
$url->setBaseUri("/");
// Static resources go through a CDN
$url->setStaticBaseUri("http://static.mywebsite.com/");
Phalcon\Tag will request both dynamical and static URIs using this component.
The Phalcon\Mvc\UrlInterface interface must be implemented to create your own URL generator replacing the one provided by Phalcon.
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/url.html