Generar Direcciones URL y Rutas

Phalcon\Mvc\Url es el componente responsable de generar URLs en una aplicación Phalcon. Es capaz de producir URLs independientes basadas en rutas.

Configuración de un URI base

Dependiendo del directorio del documento en el que esté instalada su aplicación, puede tener un URI base o no.

Por ejemplo, si el documento raíz es es/var/www/htdocs y su aplicación se instala en en/var/www/htdocs/invo entonces su baseUri será /invo/. Si usted está utilizando un VirtualHost o la aplicación se instala en la raíz del documento, su baseUri es /. Ejecute el siguiente código para saber el URI base detectado por Phalcon:

<?php

use Phalcon\Mvc\Url;

$url = new Url();

echo $url->getBaseUri();

Por defecto, Phalcon puede detectar automáticamente su baseUri, pero si quieres mejorar el rendimiento de su aplicación se recomienda configurarlo manualmente:

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// Establecer una URI base relativa
$url->setBaseUri('/invo/');

// Establecer un dominio completo como URI base
$url->setBaseUri('//my.domain.com/');

// Establecer un dominio completo como URI base
$url->setBaseUri('http://my.domain.com/my-app/');

Generalmente, este componente debe estar registrado en el contenedor de inyección de dependencias, por lo que se puede establecer ahí mismo:

<?php

use Phalcon\Mvc\Url;

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

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

        return $url;
    }
);

Generando URIs

Si está utilizando un Router con su comportamiento por defecto, la aplicación es capaz de coincidir las rutas basadas en el patrón siguiente:

Por consiguiente es muy fácil crear rutas que satisfacen ese patrón (o cualquier otro patrón definido en el router) pasando una cadena para el método get():

<?php echo $url->get('products/save'); ?>

Note que no es necesario incluir al inicio la URL base. Si tiene rutas nombradas, puede cambiarlo fácilmente creándolo dinámicamente. Por ejemplo si usted tiene la siguiente ruta:

<?php

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

Puede generar una dirección URL de la siguiente manera:

<?php

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

Produciendo URLs sin mod_rewrite

También puede utilizar este componente para crear URLs sin mod_rewrite:

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// Pasar el URI en $_GET['_url']
$url->setBaseUri('/invo/index.php?_url=/');

// Esto produce: /invo/index.php?_url=/products/save
echo $url->get('products/save');

También se puede utilizar $_SERVER['REQUEST_URI']:

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// Pasar el URI en $_GET['_url']
$url->setBaseUri('/invo/index.php?_url=/');

// Pasar el URI usando $_SERVER['REQUEST_URI']
$url->setBaseUri('/invo/index.php/');

En este caso, es necesario manejar manualmente el URI requerido en el enrutador:

<?php

use Phalcon\Mvc\Router;

$router = new Router();

// ... Definir rutas

$uri = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);

$router->handle($uri);

Las rutas producidas se verán de la siguiente manera:

<?php

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

Produciendo URLs desde Volt

La función url() esta disponible en Volt para generar URLs usando este componente:

<a href='{{ url('posts/edit/1002') }}'>Editar</a>

Generar rutas estáticas:

<link rel='stylesheet' href='{{ static_url('css/style.css') }}' type='text/css' />

URIs Estáticas vs. Dinámicas

Este componente permite establecer una URI base diferente para los recursos estáticos en la aplicación:

<?php

use Phalcon\Mvc\Url;

$url = new Url();

// Para las URIs dinámicas
$url->setBaseUri('/');

// Los recursos estáticos pasan por un CDN
$url->setStaticBaseUri('http://static.mywebsite.com/');

Phalcon\Tag solicitará ambos URIs, dinámicos y estáticos, usando este componente.

Implementando tu Propio Generador de URLs

Debe implementar la interfaz Phalcon\Mvc\UrlInterface para crear su propio generador URL reemplazando el proporcionado por Phalcon.