URL 组件¶
概览¶
Phalcon\Mvc\Url是负责在 Phalcon 应用程序中生成 URL 的组件。它也可以用于根据路由构造 URL。
<?php
use Phalcon\Mvc\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
]
);
生成¶
The Phalcon\Mvc\Url组件可以生成静态和动态的 URL。动态 URL 还可以根据应用中定义的参数或路由生成,这些路由是通过路由器组件定义的。
静态 URL¶
静态 URL 是指指向静态资源的 URL。这些资源可以是图片、CSS/JS 文件、视频等。该Phalcon\Mvc\Url组件提供了一种简单的方法来生成这些 URL。
和getStatic()
一起,该组件还提供了 gettergetStaticBaseUri()
和 settersetStaticBaseUri()
方法,允许你为所有静态 URL 设置前缀。此功能在需要设置 CDN 或其他存储资产的位置时特别有用。
<?php
use Phalcon\Mvc\Url;
$url = new Url();
$this->setStaticBaseUri('https://assets.phalcon.io/');
echo $url->getStaticBaseUri(); // https://assets.phalcon.io/
以及在生产环境中需要使用 CDN 时:
<?php
use Phalcon\Mvc\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
上述代码将为所有静态资源加上前缀https://assets.phalcon.io
,确保生产环境中的资源使用 CDN URL,而本地开发直接从你的机器加载。
注意
在setStaticBaseUrl()
参数中的尾部斜杠是可选的。如果未指定,它会自动附加到传递的参数。
最后,根据你指定的路由,可以通过向getStatic()
传递数组并使用for
关键字作为键和路由名称作为值来生成
动态 URL¶
动态 URL 是根据应用程序的路由或 URL 动态生成的 URL。该Phalcon\Mvc\Url组件提供了一种简单的方法来生成这些 URL。
根据文档根目录中的哪个目录安装了你的应用程序,它可能有基本 URI 或没有。例如,如果你的文档根目录是/var/www/htdocs
并且你的应用程序安装在/var/www/htdocs/app
那么你的基本 URI 就是/app/
。如果你使用虚拟主机或将应用程序安装在文档根目录下,则基本 URI 是/
.
如果你不确定并且想找出你的基本 URI 是什么,你可以在应用程序的文件夹中执行以下代码:
默认情况下,Phalcon 将尝试检测你的基本 URI。建议你手动指定基本 URI,因为这可以稍微提高性能。
和get()
一起,该组件还提供了 gettergetBaseUri()
和 settersetBaseUri()
方法,允许你为所有 URL 设置前缀。此功能在需要为 URL 设置prefix
时特别有用,例如如果你正在处理具有特定前缀的所有路由的模块。
<?php
use Phalcon\Mvc\Url;
$url = new Url();
$this->setBaseUri('/portal/');
echo $url->getBaseUri(); // /portal/
echo $url->get('invoices/edit/1'); // /portal/invoices/edit/1
上述代码将为所有 URL 加上前缀/portal/
,使你能够更轻松地分组URL。例如,如果你有InvoicesController
并且希望 URL 加上前缀/portal/
,你可以使用setBaseUri()
中传递initialize()
方法:
<?php
use Phalcon\Mvc\Url;
use Phalcon\Mvc\Controller
/**
* @property Url $url
*/
class InvoicesController extends Controller
{
public function initialize()
{
$this->url->setBaseUri('/portal/');
}
}
现在我们可以在后续操作中使用get()
来生成任何带有前缀的 URL。/portal/
注意
在setBaseUrl()
参数中的尾部斜杠是可选的。如果未指定,它会自动附加到传递的参数。
路由¶
如果你使用的是路由器并使用其默认行为,你的应用程序能够基于以下模式匹配路由:
模式
/:controller/:action/:params
因此,通过向方法传递字符串,很容易创建符合该模式(或路由器中定义的任何其他模式)的路由。get()
:
注意不需要预先添加基本 URI。如果你有命名路由,可以轻松地动态定义它们。例如,对于以下路由:
<?php
use Phalcon\Mvc\Router;
$router = new Router();
$router
->add(
'/portal/invoices/edit/{id}',
[
'module' => 'portal',
'controller' => 'invoices',
'action' => 'edit',
]
)
->setName('invoices-edit');
现在你可以通过向invoice-edit
命名路由中定义的 URL。get()
传递数组并使用for
关键字作为键和路由名称作为值来生成
<?php
use Phalcon\Mvc\Url;
$url = new Url();
echo $url->get(
[
'for' => 'invoices-edit',
'id' => 1,
]
);
上述代码将生成/portal/invoices/edit/1
.
如果你在数组中作为第二个参数传递额外的参数,这些键值对将自动添加到生成的 URL 的查询字符串中。
<?php
use Phalcon\Mvc\Url;
$url = new Url();
echo $url->get(
[
'for' => 'invoices-edit',
'id' => 1,
], [
'is_paymented' => 'true',
'some_key' => 'some_value'
]
);
// /portal/invoices/edit/1?is_paymented=true&some_key=some_value
mod_rewrite¶
对于在 Apache 安装中使用mod_rewrite
的开发人员,Phalcon\Mvc\Url提供了替换mod_rewrite
所需的功能。这在目标系统未安装该模块或你无法自行安装时特别有用。
下面的例子展示了如何替换mod_rewrite
的文件Phalcon\Mvc\Url:
<?php
use Phalcon\Mvc\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
你还可以使用$_SERVER['REQUEST_URI']
。这需要更多工作,因为我们需要利用路由器我们的路由设置需要改为:$_SERVER['REQUEST_URI']
组件填充
<?php
use Phalcon\Mvc\Router;
$router = new Router();
// ... Define routes
$uri = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
$router->handle($uri);
现在应用程序可以像预期那样处理 URI:
<?php
use Phalcon\Mvc\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
注意
如果可以,请避免用上述代码替换mod_rewrite
。让 Web 服务器处理必要的路由匹配机制比在自己的应用程序中处理要快得多。
视图/Volt¶
Volt 中提供了函数url
用于使用此组件生成 URL:
生成静态路由:
路径¶
虽然path
不完全是一个 URL,但Phalcon\Mvc\Url提供了方法,允许你以与 URL 相同的方式为应用程序创建路径。
和path()
一起,该组件还提供了 gettergetBasePath()
和 settersetBasePath()
方法,允许你为所有路径设置前缀。
<?php
use Phalcon\Mvc\Url;
$url = new Url();
$this->setBasePath('/data/app/');
echo $url->getBasePath(); // /data/app/
echo $url->path('storage/config.php'); // /data/app/storage/config.php
上述代码将为所有路径加上前缀/data/app/
.
注意
在setBasePath()
参数中的尾部斜杠是可选的。如果未指定,它会自动附加到传递的参数。
异常¶
在Phalcon\Mvc\Url组件中抛出的任何异常类型为Phalcon\Mvc\Url\Exception。你可以使用此异常选择性地捕获仅从此组件抛出的异常。
<?php
use Phalcon\Mvc\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();
}
}
}
自定义¶
如果你想实现自己的功能,可以使用 [Phalcon\Mvc\Url\UrlInterface][url-interface]Url
组件。实现此接口将确保你的自定义组件可以与 Phalcon 协同工作。
依赖注入¶
如果您使用Phalcon\Di\FactoryDefault容器,Phalcon\Mvc\Url已经为你注册好了。然而,你可能需要覆盖默认注册以便设置你自己的setBaseUri()
。或者,如果你没有使用Phalcon\Di\FactoryDefault并且改为使用了Phalcon\Di注册方法是一样的。这样做之后,你将能够从控制器、模型、视图以及任何实现了该接口的组件中访问你的配置对象。Injectable
.
注册。下面是一个注册服务以及访问它的示例:
<?php
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Url;
// Create a container
$container = new FactoryDefault();
$container->set(
'url',
function () {
$url = new Url();
$url->setBaseUri('/portal/');
return $url;
},
true
);
该组件现在可以通过url
键名在你的控制器中使用
<?php
use Phalcon\Mvc\Controller;
use Phalcon\Mvc\Url;
/**
* @property Url $url
*/
class MyController extends Controller
{
private function getUrl(): string
{
return $this->url->get('/portal/invoices/link');
}
}
同样,在你的视图(Volt 语法)中url
辅助方法提供了相同的功能:
当然,你可以像访问依赖注入容器中的任何已注册服务一样访问该对象: