生成 URL 和 路径(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.

Phalcon\Mvc\Url 组件负责在Phalcon应用内生成URL。它依赖路由生成独立的URL。

设置站点基地址(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:

  1. <?php
  2. use Phalcon\Mvc\Url;
  3. $url = new Url();
  4. 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:

  1. <?php
  2. use Phalcon\Mvc\Url;
  3. $url = new Url();
  4. // Setting a relative base URI
  5. $url->setBaseUri("/invo/");
  6. // Setting a full domain as base URI
  7. $url->setBaseUri("//my.domain.com/");
  8. // Setting a full domain as base URI
  9. $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:

  1. <?php
  2. use Phalcon\Mvc\Url;
  3. $di->set(
  4. "url",
  5. function () {
  6. $url = new Url();
  7. $url->setBaseUri("/invo/");
  8. return $url;
  9. }
  10. );

生成 URI(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”:

  1. <?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:

  1. <?php
  2. $router->add(
  3. "/blog/{year}/{month}/{title}",
  4. [
  5. "controller" => "posts",
  6. "action" => "show",
  7. ]
  8. )->setName("show-post");

A URL can be generated in the following way:

  1. <?php
  2. // This produces: /blog/2015/01/some-blog-post
  3. $url->get(
  4. [
  5. "for" => "show-post",
  6. "year" => "2015",
  7. "month" => "01",
  8. "title" => "some-blog-post",
  9. ]
  10. );

没有伪静态状态下的生成 URL(Producing URLs without mod_rewrite)

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

  1. <?php
  2. use Phalcon\Mvc\Url;
  3. $url = new Url();
  4. // Pass the URI in $_GET["_url"]
  5. $url->setBaseUri("/invo/index.php?_url=/");
  6. // This produce: /invo/index.php?_url=/products/save
  7. echo $url->get("products/save");

You can also use $_SERVER["REQUEST_URI"]:

  1. <?php
  2. use Phalcon\Mvc\Url;
  3. $url = new Url();
  4. // Pass the URI in $_GET["_url"]
  5. $url->setBaseUri("/invo/index.php?_url=/");
  6. // Pass the URI using $_SERVER["REQUEST_URI"]
  7. $url->setBaseUri("/invo/index.php/");

In this case, it’s necessary to manually handle the required URI in the Router:

  1. <?php
  2. use Phalcon\Mvc\Router;
  3. $router = new Router();
  4. // ... Define routes
  5. $uri = str_replace($_SERVER["SCRIPT_NAME"], "", $_SERVER["REQUEST_URI"]);
  6. $router->handle($uri);

The produced routes would look like:

  1. <?php
  2. // This produce: /invo/index.php/products/save
  3. echo $url->get("products/save");

Volt 中生成 URL(Volt Producing URLs from Volt)

The function “url” is available in volt to generate URLs using this component:

  1. <a href="{{ url("posts/edit/1002") }}">Edit</a>

Generate static routes:

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

静态 URI 与 动态 URI(Static vs. Dynamic URIs)

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

  1. <?php
  2. use Phalcon\Mvc\Url;
  3. $url = new Url();
  4. // Dynamic URIs are
  5. $url->setBaseUri("/");
  6. // Static resources go through a CDN
  7. $url->setStaticBaseUri("http://static.mywebsite.com/");

Phalcon\Tag will request both dynamical and static URIs using this component.

自定义 URL 生成器(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.