跳至主要内容

路由

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路由与路线本身分开。