Generating URLs and Paths

Phalcon\Mvc\Url is the component responsible of generate URLs in a Phalcon application. It's capable of produce independent URLs based on routes.

Setting a base URI

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:

<?php

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:

<?php

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:

<?php

use Phalcon\Mvc\Url;

$di->set(
    'url',
    function () {
        $url = new Url();

        $url->setBaseUri('/invo/');

        return $url;
    }
);

Generating URIs

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:

<?php

$router
    ->add(
        '/blog/{year}/{month}/{title}',
        [
            'controller' => 'posts',
            'action'     => 'show',
        ]
    )
    ->setName('show-post');

A URL can be generated in the following way:

<?php

// This produces: /blog/2015/01/some-blog-post
$url->get(
    [
        'for'   => 'show-post',
        'year'  => '2015',
        'month' => '01',
        'title' => 'some-blog-post',
    ]
);

Producing URLs without mod_rewrite

You can use this component also to create URLs without mod_rewrite:

<?php

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']:

<?php

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:

<?php

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:

<?php

// This produce: /invo/index.php/products/save
echo $url->get('products/save');

Producing URLs from Volt

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' />

Static vs. Dynamic URIs

This component allow you to set up a different base URI for static resources in the application:

<?php

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 dynamic and static URIs using this component.

Implementing your own URL Generator

The Phalcon\Mvc\UrlInterface interface must be implemented to create your own URL generator replacing the one provided by Phalcon.