- Swoft控制器Controller作为HTTP服务的核心组件,串接起一次请求的整个生命周期。
- Swoft控制器可通过注解Annotation的方式访问路由,简化代码。
创建控制器
$ docker-machine ls
$ docker-machine ip default
192.168.99.100
$ docker-machin ssh default
docker@default ~$ docker ps -a
docker@default ~$ docker exec -it myswoft bash
- 通过命令行
gen:controller
命令快捷创建控制器类
php bin/swoft gen:controller test --prefix=/test -y
root@db68453f8674:/var/www/swoft# php bin/swoft gen:controller test --prefix=/test -y
Class data:
{
"name": "test",
"suffix": "Controller",
"namespace": "App\\Controllers",
"className": "TestController",
"prefix": "/test",
"idVar": "{id}"
}
Target File: /var/www/swoft/app/Controllers/TestController.php
OK, write successful!
查看项目swoft/app/Controllers/TestController.php
控制器文件
$ vim app/Controllers/TestController.php
<?php
/**
* This file is part of Swoft.
*
* @link https://swoft.org
* @document https://doc.swoft.org
* @contact group@swoft.org
* @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE
*/
namespace App\Controllers;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
// use Swoft\View\Bean\Annotation\View;
// use Swoft\Http\Message\Server\Response;
/**
* Class TestController
* @Controller(prefix="/test")
* @package App\Controllers
*/
class TestController{
/**
* this is a example action. access uri path: /test
* @RequestMapping(route="/test", method=RequestMethod::GET)
* @return array
*/
public function index(): array
{
return ['item0', 'item1'];
}
}
重启容器后使用浏览器访问
docker@default:~$ docker restart myswoft
使用浏览器访问http://192.168.99.100/test
查看显示结果
注意观察:
通过Swoft命令创建的控制器类TestController
中存在默认的方法index
中
首先需要提前引入注解类
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
然后有两个值得注意的注解Annotation
@Controller(prefix="/test")
@RequestMapping(route="/test", method=RequestMethod::GET)
这两个注解有什么作用呢?那这里就不得不聊到Swoft中的路由了!
创建路由Route
根据约定大于配置的规则,路由应该在用户看到URI的时候,就能找到与之对应的Controller/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或闭包中。
路由注解 @Controller + @RequestMapping
Swoft中路由主要通过注解@Controller
+@RequestMapping
实现,注解@Controller
定义前缀,注解@RequestMapping
定义后缀。
1. 类注解 @Controller
@Controller
表示类注解,使用在控制器类上,标记当前类是一个HTTP控制器类。
使用:
- 显式指定路由前缀
@Controller(prefix="/route")
@Controller("/route")
- 隐式指定路由前缀
@Controller()
默认自动解析为controller class
控制器类名,注意使用驼峰法命名格式。
2. 方法注解 @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)
说明:
- 使用注解必须要提前引入对应注解类
- 完整的路由
path
由控制器Controller
的前缀prefix
后跟动作方法Action
的路由route
共同组成 - 当动作方法
Action
上的路由以/
开头时,完整的路由就是它。
创建视图View
以后台登录为例,将路由、控制器、视图三者联系起来。
首先创建后台登录控制器
$ vim /swoft/app/Controllers/Admin/LoginController.php
<?php
namespace App\Controllers\Admin;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
use Swoft\View\Bean\Annotation\View;
use Swoft\Http\Message\Server\Request;
use Swoft\Http\Message\Server\Response;
/**
* Class LoginController
* @Controller(prefix="/admin/login")
* @package App\Controllers
*/
class LoginController{
/**
* this is a example action. access uri path: /admin
* @RequestMapping(route="index", method={RequestMethod::GET, RequestMethod::POST})
* @View(template="admin/login/index")
* @param Request $request
* @return array
*/
public function index(Request $request):array
{
$data = [];
$data["name"] = "admin:login:index";
return $data;
}
}
命名空间
namespace App\Controllers\Admin;
注解
@Controller(prefix="/admin/login")
use Swoft\Http\Server\Bean\Annotation\Controller;
@RequestMapping(route="index", method={RequestMethod::GET, RequestMethod::POST})
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
@View(template="admin/login/index")
use Swoft\View\Bean\Annotation\View;
创建视图
$ vim /swoft/resources/views/admin/login/index.php
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?= $name ?></title>
</head>
<body>
</body>
</html>
最后重启容器后在浏览器输入http://192.168.99.100:80/admin/login
查看最终效果
docker@default:~$ docker restart myswoft
myswoft
小结:这里完成了最基本请求、路由、视图的流程,接下来需要重点掌握HTTP请求与响应两部分,这是在Web开发中使用最为频繁的地方。
未完待续...