ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 生成URL和路径 `Phalcon\Mvc\Url` 是负责在Phalcon应用程序中生成URL的组件。它能够根据路由生成独立的URL。 ## 设置基本URI 根据您的应用程序安装的文档根目录,它可能具有基本URI。 例如,如果您的文档根目录是`/var/www/htdocs` ,并且您的应用程序安装在`/var/www/htdocs/invo`中,那么您的baseUri将是`/invo/`。如果您使用的是VirtualHost,或者您的应用程序安装在文档根目录上,那么您的baseUri是`/`。执行以下代码以了解Phalcon检测到的基URI: ```php <?php use Phalcon\Mvc\Url; $url = new Url(); echo $url->getBaseUri(); ``` 默认情况下,Phalcon会自动检测您的baseUri,但如果您想提高应用程序的性能,建议您手动设置它: ```php <?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/'); ``` 通常,此组件必须在Dependency Injector容器中注册,因此您可以在那里进行设置: ```php <?php use Phalcon\Mvc\Url; $di->set( 'url', function () { $url = new Url(); $url->setBaseUri('/invo/'); return $url; } ); ``` ## 生成URI 如果您使用路由器的默认行为,您的应用程序可以根据以下模式匹配路由: >[info] /:controller/:action/:params 因此,很容易创建满足该模式(或路由器中定义的任何其他模式)的路由,将字符串传递给方法`get`: ```php <?php echo $url->get('products/save'); ?> ``` 请注意,不必预先添加基URI。如果您已命名路由,则可以轻松地更改它以动态创建它。例如,如果您有以下路由: ```php <?php $router ->add( '/blog/{year}/{month}/{title}', [ 'controller' => 'posts', 'action' => 'show', ] ) ->setName('show-post'); ``` 可以通过以下方式生成URL: ```php <?php // This produces: /blog/2015/01/some-blog-post $url->get( [ 'for' => 'show-post', 'year' => '2015', 'month' => '01', 'title' => 'some-blog-post', ] ); ``` ## 生成没有mod_rewrite的URL 您也可以使用此组件创建没有mod_rewrite的URL: ```php <?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'); ``` 你也可以使用 `$_SERVER['REQUEST_URI']`: ```php <?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/'); ``` 在这种情况下,需要在路由器中手动处理所需的URI: ```php <?php use Phalcon\Mvc\Router; $router = new Router(); // ... Define routes $uri = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']); $router->handle($uri); ``` 生成的路由看起来像: ```php <?php // This produce: /invo/index.php/products/save echo $url->get('products/save'); ``` ## 在Volt生成URL volt中的`url`函数使用此组件生成URL: ```twig <a href='{{ url('posts/edit/1002') }}'>Edit</a> ``` 生成静态路由: ```twig <link rel='stylesheet' href='{{ static_url('css/style.css') }}' type='text/css' /> ``` ## 静态与动态URI 此组件允许您为应用程序中的静态资源设置不同的基URI: ```php <?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` 将使用此组件请求动态和静态URI。 ## 实现自己的URL生成器 必须实现`Phalcon\Mvc\UrlInterface`接口才能创建自己的URL生成器,替换Phalcon提供的URL生成器。