Swoft Route 路由

Swoft中路由是通过注解@Controller + @RequestMapping组合来实现的,主要包括:

  • @Controller 在控制器类中使用,用于定义路由前缀。
  • @RequestMapping 在控制器类的动作方法中使用,用于定义路由后缀。

创建路由Route

根据约定大于配置的规则,路由应该在用户看到URI的时候,就能找到与之对应的Controller/Action

例如:要访问的路由为/admin/account/index,路由前缀@Controller可以直接定义到控制器这一层/admin/account。路由后缀@RequestMapping可以直接定义到动作方法这一层index,注意不用在前面添加/,可以是方法名称也可以是其它名称。

use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;

/**
 * 账号管理
 * @Controller(prefix="/admin/account")
 */
class AccountController
{
  /**
   * @RequestMapping(route="index", method={RequestMethod::GET})
   * @View(template="admin/account/index", layout="admin/layout")
   * @return array
   */
  public function index(Request $request):array
  {

  }
}

首先,使用路由前,必须引入与之对应的注解类。

use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;

注意:视图注解@View中的模板与布局参数中的值与路由比较起来会发现,它的路径是不需要前面添加/的。

@View(template="admin/account/index", layout="admin/layout")

若添加了//admin/account/index则会出现错误

{
  "msg":"cannot render '\/admin\/account\/index' because the view file does not exist. File: \/admin\/group\/index.php",
  "file":"\/var\/www\/swoft\/vendor\/swoft\/view\/src\/Base\/View.php",
  "line":136,
  "code":0
}

建议这些细节的地方,追踪源码进行修改下,有时间自己会做做。

类注解@Controller

@Controller表示类注解,使用在控制器类上,标记当前类是一个HTTP控制器类。

显式指定路由前缀

  • @Controller(prefix="/route")
  • @Controller("/route")

隐式指定路由前缀

@Controller() 默认自动解析为controller class控制器类名,注意使用驼峰法命名格式。

方法注解@RequestMapping

@RequestMapping表示方法注解,用于控制器类的动作方法Action上。

格式:@RequestMapping(route, method)

/**
  * @RequsetMapping(route, method)
  */
public function actionName(){}

参数:

  • route 表示设置的路由路径path,是默认参数。
  • method 表示允许的请求方法,可设置多个。

使用:

  • 显式指定路由后缀
    @RequestMapping()
    @RequestMapping("index")
    @RequestMapping(route="index")
  • 隐式指定路由后缀
    如果不使用@RequestMapping@RequestMapping()则默认解析方法名为后缀。

指定路由方法用于限定HTTP请求的方式

  • @RequestMapping(route="index", method=RequestMethod::GET)
  • @RequestMapping(route="index", method={RequestMethod::GET,RequestMethod::POST})

指定路由参数,在Action动作方法中可直接使用$name作为方法参数。

@RequestMapping(route="index/{$name}", method=RequestMethod::GET)

例如:要访问路由的URI为/admin/account/state/1

/**
 * @RequestMapping(route="state/{pk}", method={RequestMethod::GET})
 */
public function state(Request $request, $pk)
{
    var_dump($pk);//string(1) "1"
    return response()->redirect("/admin/account/index");
}

注意:这里使用的变量名为pk,可自由定义,获取出来的是一个字符串类型的值。

说明:

  • 使用注解必须要提前引入对应注解类
  • 完整的路由path由控制器Controller的前缀prefix后跟动作方法Action的路由route共同组成
  • 当动作方法Action上的路由以/开头时,完整的路由就是它。

路由配置httpRouter

Swoft中HTTP路由的配置文件在/swoft/config/beans/base.php

    'httpRouter'       => [
        'ignoreLastSlash'  => false,
        'tmpCacheNumber' => 1000,
        'matchAll'       => '',
    ],

配置参数解析

  • ignoreLastSlash
    表示是否忽略最后一个斜杠,若设置为false/user/index/user/index/表示两个不同的路由。
  • tmpCacheNumber
    表示缓存路由的数量,默认最近1000条。缓存到路由对象的重启后会失效,只会缓存动态路由。
  • matchAll
    表示匹配所有,也就是所有请求都会匹配到这个URL或闭包中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值