路由
Pagekit解决的一个核心任务是路由。当浏览器点击到一个URL,框架决定调用什么动作。
控制器
在 Pagekit 中创建路由最常见的方式是定义一个控制器。控制器负责处理请求、设置路由和渲染视图。
寄存控制器
你可以在模块配置中注册控制器。利用该属性将控制器挂载到路由上。routes
'routes' => [
'/hello' => [
'name' => '@hello/admin',
'controller' => [
'Pagekit\\Hello\\Controller\\HelloController'
]
]
],
基本结构
类被注释为 ,使控制器挂载于 。这意味着它会响应所有针对该URL和子URL的请求,比如。@Route("/hello")http://example.com/hello/http://example.com/hello/settings
namespace Pagekit\Hello\Controller;
/**
* @Route("/hello")
*/
class HelloController
{
public function indexAction()
{
// ...
}
public function settingsAction()
{
// ...
}
}
默认情况下,你的扩展(或主题)会被启动,并自动生成一组默认路由。你可以使用开发者工具栏查看新注册的路线(以及所有核心路线)。
以下是理解路线的方法:
| 路线 | 示例 | 描述 |
|---|---|---|
| 名称 | @hello/hello/settings |
路由名称可以用来生成URL(必须是唯一的)。 |
| URI | /hello/settings |
浏览器中访问该路径的路径。 |
| 行动 | Pagekit\Hello\Controller\DefaultController::settingsAction |
将调用的控制器动作。 |
默认情况下,路由的形式为 。特殊动作是 ,不会挂在 ,而是挂在 。当然,自定义路线的高级选项也可用,正如你将在接下来的章节中看到的。http://example.com/<extension>/<controller>/<action>indexAction.../index.../
如果某个路由在你的应用中不独特,那么最先添加的路由就是正在使用的那条。由于这是框架内部行为可能会变化,你不应依赖这些,而是确保你的路由是唯一的。
注释
控制器的很多行为是由类和方法标注的信息决定的。以下是简要概述,下面是每个注释的详细描述。
| 注释 | 描述 |
|---|---|
@Route |
路径是安装一个动作或整个控制器。 |
@Request |
处理从 HTTP 请求传递到方法的参数。 |
@Access |
检查用户权限。 |
注释只有在多行评论开头加两个星号时才有效,而不是只有一个。
// will NOT work:
/* @Route("/hello") */
// will work:
/** @Route("/hello") */
// will work:
/**
* @Route("/hello")
*/
@Route
定义控制器(或控制器动作)将被挂载的路由。它可以被注释到类和方法定义中。
默认情况下,调用的方法将作为类路由下挂载。要添加自定义路由,你可以在方法中添加任意数量的额外路径。路由还可以包含动态参数,这些参数会传递给方法。greetAction/greet
/**
* @Route("/greet", name="@hello/greet/world")
* @Route("/greet/{name}", name="@hello/greet/name")
*/
public function greetAction($name = 'World')
{
// ...
}
参数可以指定以满足特定要求(例如将值限制为数字)。你可以给一条路线命名,这样你就能从代码中引用。在方法定义中使用PHP参数默认值,将参数设置为可选。
路由可以绑定到某些HTTP方法(例如: 或)。这对 RESTful API 尤其有用。GETPOST
/**
* @Route("/view/{id}", name="@hello/view/id", requirements={"id"="\d+"}, methods="GET")
*/
public function viewAction($id = 0)
{
// ...
}
如需详细信息和更多示例,请查看Symfony官方关于注释的文档。@Route
@Request
你可以指定通过请求传递的数据类型,并将其与传递给注释方法的参数匹配。
数组将名称映射到类型。name 是请求数据中的密钥。类型可以是 ,也可以是 ,高级类型 可以是整数数组。如果未指定类型,默认假设 。intstringarrayint[]string
键的顺序决定了参数传递给方法的顺序。方法头中的参数名称可以是任意。
/**
* @Request({"id": "int", "title", "config": "array"}, csrf=true)
*/
public function saveAction($id, $title, $config)
{
// ...
}
你也可以检查是否有令牌来防止CSRF。在你的请求注释中添加,并在提交该方法表单的视图中包含调用。csrf=true@token
查看完整的可用过滤器列表。有些滤波器还有额外的选项,比如。Pagekit\Filter\FilterManagerpregreplace
/**
* @Request({"folders":"pregreplace[]"}, options={"folders" = {"pattern":"/[^a-z0-9_-]/i"}})
*/
public function deleteFolders($folders)
{
// ...
}
@Access
你可以指定访问特定方法或整个控制器所需的特定用户权限。
控制器应该始终针对前端或管理面板。到目前为止,我们已经看到了前端控制器。管理控制器只有获得许可后才会对用户开放。此外,该控制器的所有路由URL中都会有引言。因此,视图也会在管理布局中渲染,而非默认主题布局。Access admin areaadmin/
/**
* @Access(admin=true)
*/
class SettingsController
{
// ...
}
现在,只有拥有访问管理员区域权限的用户才能访问控制器作。如果你想使用更多限制,只允许特定用户执行特定作(比如管理用户等),你可以对单个控制器的作添加限制。
在(或)文件中定义权限,并以任何你想要的方式组合它们。控制器层级的访问限制将与单一作的访问限制合并。因此,你可以为控制器设定基本的最低访问权限等级,并将某些作(如管理作)限制给拥有更具体权限的用户。extension.phptheme.php
/**
* @Access("hello: manage users")
*/
public function saveAction()
{
// ...
}
当然,即使控制器不是管理员区控制器,你也可以使用这些限制。你也可以检查单个控制器作的管理员权限。
/**
* @Access("hello: edit article", admin=true)
*/
public function editAction()
{
// ...
}
生成URL(网址)
利用URL服务,你可以生成路由的URL。
$this['url']->route('@hello/default/index') // '/hello/default/index'
$this['url']->route('@hello/default/index', true) // 'http://example.com/hello/default/index'
$this['url']->route('@hello/view/id', ['id' => 23]) // '/hello/view/23'
链接
Pagekit 的路由可以通过内部路由语法来描述。它们由路线名称(例如“@hello/名称”)组成,后面可选地跟随GET参数(例如“@hello/name?name=World”)。这被称为链接。它将实际的URI路由与路线本身分开。