生成 URL 和 路径(Generating URLs and Paths)

在Phalcon应用程序中,使用 Phalcon\Mvc\Url 组件生成URL。它能够生成基于路由的独立的URL。

设置站点基地址(Setting a base URI)

根据你的应用程序安装到主机文档目录的位置,你的应用程序URI可能会出现一个基础的URI。

例如,如果你的主机文档目录是 /var/www/htdocs,而你的应用程序安装到 /var/www/htdocs/invo,那么基础URI即为 /invo/.如果你使用虚拟主机的形式安装此应用,那么baseUri即为 /. 执行以下代码,你可以检测你的应用程序的baseUri.

  1. <?php
  2.  
  3. use Phalcon\Mvc\Url;
  4.  
  5. $url = new Url();
  6. echo $url->getBaseUri();

默认情况下,Phalcon 会自动检测应用程序的baseUri.但如果你想提高应用程序性能的话,推荐手工设置:

  1. <?php
  2.  
  3. use Phalcon\Mvc\Url;
  4.  
  5. $url = new Url();
  6.  
  7. // Setting a relative base URI
  8. $url->setBaseUri('/invo/');
  9.  
  10. // Setting a full domain as base URI
  11. $url->setBaseUri('//my.domain.com/');
  12.  
  13. // Setting a full domain as base URI
  14. $url->setBaseUri('http://my.domain.com/my-app/');

通常情况下,此组件必须被注册到服务容器中,因此你可以直接这样设置它:

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

生成 URI(Generating URIs)

如果你使用的是 Router 的默认行为。你的应用程序会匹配路由模式 : /:controller/:action/:params. 因此,很容易通过”get”方法得到:

  1. <?php echo $url->get("products/save"); ?>

请注意,预先设置baseUri并不是必须的。如果你已经通过设置路由命名,你可以很容易改变它。例如,你有以下途径:

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

生成URL还可以通过以下方式:

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

如果使用 Phalcon\Mvc\Router\Route 的方法 setUrlGenerator 设置了 URL 生成器,这里将会调用设置的 URL 生成器生成 URL。

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

你还可以使用此组件在不使用重写规则的情况下创建URL:

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

你也可以使用 $_SERVER["REQUEST_URI"]:

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

在这种情况下,你必须手工处理路由中的URI:

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

产生的路由看起来像这样:

  1. <?php
  2.  
  3. // This produce: /invo/index.php/products/save
  4. 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.  
  3. use Phalcon\Mvc\Url;
  4.  
  5. $url = new Url();
  6.  
  7. // Dynamic URIs are
  8. $url->setBaseUri('/');
  9.  
  10. // Static resources go through a CDN
  11. $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 URLgenerator replacing the one provided by Phalcon.

原文: http://www.myleftstudio.com/reference/url.html