Componente Url


Resumen

Phalcon\Url is the component responsible of generate URLs in a Phalcon application. También se puede usar para construir URLs basadas en rutas.

<?php

use Phalcon\Url;

$url = new Url();

$url->setBaseUri("/portal/");
echo $url->get("invoices/edit/1"); // /portal/invoices/edit/1 

echo $url->get(
    [
        "for"   => "invoices-edit", // route name
        "title" => "Edit Invoice",  // title
        "id"    => 1,               // route parameter
    ]                             
);

Generación

The Phalcon\Url component can generate URLs that are static as well as dynamic ones. Las URLs dinámicas se pueden generar también basadas en parámetros o rutas de su aplicación, como se define usando el componente [Router][routing].

URLs Estáticas

Las URLs estáticas son las que se refieren a recursos estáticos. Pueden ser imágenes, recursos CSS/JS, vídeos, etc. The Phalcon\Url component offers an easy way to generate those URLs.

<?php

use Phalcon\Url;

$url = new Url();

echo $url->getStatic("img/logo.png");

Junto con getStatic(), el componente también ofrece los métodos getter getStaticBaseUri() y setter setStaticBaseUri(), que le permiten establecer un prefijo para todas sus URLs estáticas. Esta funcionalidad puede ser especialmente útil cuando necesita configurar un CDN o una localización diferente donde están almacenados sus recursos.

<?php

use Phalcon\Url;

$url = new Url();

$this->setStaticBaseUri('https://assets.phalcon.io/');

echo $url->getStaticBaseUri(); // https://assets.phalcon.io/

y cuando sea necesario usar un CDN para su entorno de producción:

<?php

use Phalcon\Url;

$url = new Url();

if ($environment === 'production') {
    $this->setStaticBaseUri('https://assets.phalcon.io/');
}

echo $url->getStatic('img/logo.png'); // https://assets.phalcon.io/img/logo.png

El código anterior añadirá un prefijo a todos los recursos estáticos con https://assets.phalcon.io, asegurando que todos los recursos en su entorno de producción usan la URL del CDN, mientras que en el desarrollo local se cargarán directamente desde su máquina.

NOTE: The trailing slash in the setStaticBaseUrl() parameter is optional. If it is not specified, it will automatically be appended to the passed parameter

Finalmente, dependiendo de las rutas que haya especificado, puede recuperar un recurso estático definido como una ruta nombrada pasando un vector a getStatic() y usando la palabra clave for como clave y el nombre de la ruta como valor.

<?php

use Phalcon\Url;

$url = new Url();

echo $url->getStatic(
    [
        'for' => 'logo-cdn',
    ]
);

URLs Dinámicas

Las URLs dinámicas son URLs que se generan dinámicamente, ej. basadas en las rutas o URLs de su aplicación. The Phalcon\Url component offers an easy way to generate those URLs.

Dependiendo del directorio del document root donde esté instalada su aplicación, podrá tener una URI base o no. Por ejemplo, si su document root es /var/www/htdocs y su aplicación está instalada en /var/www/htdocs/app entonces su baseUri será /app/. Si está usando un VirtualHost o su aplicación está instalada en el document root, entonces su URI base es /.

Si no está seguro y quiere saber cuál es su URI base, puede ejecutar el siguiente código en la carpeta de su aplicación:

<?php

use Phalcon\Url;

$url = new Url();

echo $url->getBaseUri();

Por defecto, Phalcon intentará detectar su URI base. Se recomienda que especifique la URI base usted mismo, ya que aumenta notablemente el rendimiento.

<?php

use Phalcon\Url;

$url = new Url();

echo $url->get("/portal/invoices/edit/1");

Junto con get(), el componente también ofrece los métodos getter getBaseUri() y setter setBaseUri(), que le permiten configurar un prefijo para todas sus URLs. Esta funcionalidad puede ser especialmente útil cuando necesita configurar un prefijo para sus URLs, ej. si trabaja con módulos que tienen un prefijo específico para todas las rutas.

<?php

use Phalcon\Url;

$url = new Url();

$this->setBaseUri('/portal/');

echo $url->getBaseUri(); // /portal/

echo $url->get('invoices/edit/1'); // /portal/invoices/edit/1

The above code will prefix all the URLs with /portal/, allowing you to group URLs easier. Por ejemplo, si tiene InvoicesController y quiere que las URLs estén prefijadas con /portal/, puede usar setBaseUri() en el método initialize():

<?php

use Phalcon\Url;
use Phalcon\Mvc\Controller

/**
 * @property Url $url
 */
class InvoicesController extends Controller
{
    public function initialize()
    {
        $this->url->setBaseUri('/portal/');
    }
}

Y ahora podemos generar cualquier URL usando get() en acciones posteriores, que serán prefijadas con /portal/

NOTE: The trailing slash in the setBaseUrl() parameter is optional. If it is not specified, it will automatically be appended to the passed parameter

Ruteo

Si está usando el Router con su comportamiento predeterminado, su aplicación será capaz de encajar rutas basadas en el siguiente patrón:

/:controller/:action/:params

Por lo tanto, es fácil crear rutas que satisfagan ese patrón (o cualquier otro patrón definido en el enrutador) pasando una cadena al método get():

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

Tenga en cuenta que no es necesario anteponer la URI base. Si tiene rutas nombradas fácilmente puede definirlas dinámicamente. Por ejemplo, para la siguiente ruta:

<?php

use Phalcon\Mvc\Router;

$router = new Router();

$router
    ->add(
        '/portal/invoices/edit/{id}',
        [
            'module'     => 'portal',
            'controller' => 'invoices',
            'action'     => 'edit',
        ]
    )
    ->setName('invoices-edit');

Ahora puede generar una URL definida en la ruta nombrada invoice-edit, pasando un vector a get() y usar la palabra clave for como clave y el nombre de la ruta como valor.

<?php

use Phalcon\Url;

$url = new Url();

echo $url->get(
    [
        'for' => 'invoices-edit',
        'id'  => 1,
    ]
);

Lo anterior producirá /portal/invoices/edit/1.

mod_rewrite

Developers that are utilizing mod_rewrite in their Apache installations, Phalcon\Url offers the necessary functionality to replace mod_rewrite. Esto es especialmente útil si el sistema de destino no tiene el módulo instalado o no puede instalarlo usted mismo.

The following example shows you how to replace mod_rewrite with Phalcon\Url:

<?php

use Phalcon\Url;

$url = new Url();

$url->setBaseUri('/app/public/index.php?_url=/'); // $_GET['_url']

echo $url->get('products/save'); // /app/public/index.php?_url=/portal/invoices/save

También puede usar $_SERVER['REQUEST_URI']. Esto requiere un poco más de trabajo, ya que necesitamos usar el componente Router para rellenar $_SERVER['REQUEST_URI']. Nuestra configuración de rutas necesita cambiar a:

<?php

use Phalcon\Mvc\Router;

$router = new Router();

// ... Define routes

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

$router->handle($uri);

y ahora la aplicación puede procesar la URL como se espera:

<?php

use Phalcon\Url;

$url = new Url();

$url->setBaseUri('/app/public/index.php'); // $_SERVER['REQUEST_URI']

echo $url->get('products/save'); // /app/public/index.php/portal/invoices/save

NOTE: If you can, avoid replacing mod_rewrite with the code above. Tener el mecanismo de encaje de rutas necesario gestionado por el servidor web es mucho más rápido que gestionarlo en su propia aplicación.

View/Volt

La función url está disponible en volt para generar URLs usando este componente:


<a href='{{ url('invoices/edit/1') }}'>Edit</a>

Generar rutas estáticas:


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

Path

Although a path is not really a URL, the Phalcon\Url offers methods that allow you to create paths for your application, the same way as URLs.

<?php

use Phalcon\Url;

$url = new Url();

echo $url->path("/data/app/storage/");

Junto con path(), el componente también ofrece los métodos getter getBasePath() y setter setBasePath(), que le permiten configurar un prefijo para todos sus caminos.

<?php

use Phalcon\Url;

$url = new Url();

$this->setBasePath('/data/app/');

echo $url->getBasePath(); // /data/app/

echo $url->path('storage/config.php'); // /data/app/storage/config.php

El código anterior prefijará todos los caminos con /data/app/.

NOTE: The trailing slash in the setBasePath() parameter is optional. If it is not specified, it will automatically be appended to the passed parameter

Excepciones

Any exceptions thrown in the Phalcon\Url component will be of type Phalcon\Url\Exception. Puede usar esta excepción para capturar selectivamente sólo las excepciones lanzadas desde este componente.

<?php

use Phalcon\Url\Exception;
use Phalcon\Mvc\Controller;

class IndexController extends Controller
{
    public function index()
    {
        try {
            // Get some configuration values
            $this->url->get('/portal/invoices/list');
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }
}

Personalizado

[Phalcon\UrlInterface][url-interface] está disponible si desea implementar su propio componente Url. Implementar este interfaz asegurará que su componente personalizado funcionará con Phalcon.

Inyección de Dependencias

If you use the Phalcon\Di\FactoryDefault container, the Phalcon\Url is already registered for you. Sin embargo, podría querer sobreescribir el registro predeterminado para poder establecer su propio setBaseUri(). Alternatively if you are not using the Phalcon\Di\FactoryDefault and instead are using the Phalcon\Di the registration is the same. Al hacerlo, podrá acceder a su objeto de configuración desde controladores, modelos, vistas y cualquier componente que implemente Injectable.

A continuación, un ejemplo de registro del servicio así como de acceso a él:

<?php

use Phalcon\Di\FactoryDefault;
use Phalcon\Url;

// Create a container
$container = new FactoryDefault();

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

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

        return $url;
    },
    true
);

El componente está disponible ahora en sus controladores usando la clave url

<?php

use Phalcon\Mvc\Controller;
use Phalcon\Url;

/**
 * @property Url $url
 */
class MyController extends Controller
{
    private function getUrl(): string
    {
        return $this->url->get('/portal/invoices/link');
    }
}

También en sus vistas (sintaxis Volt) el método ayudante url ofrece la misma funcionalidad:

{{ url('/portal/invoices/link') }}

Por supuesto, puede acceder al objeto de la misma forma que cualquier servicio registrado en el contenedor Di:

{{ url.get('/portal/invoices/link') }}