swoft 入门

前言

对比了几个基于 swoole 的框架,swoft 在 github 上面 star 数量遥遥领先的,所以准备基于 swoft 开始一个小项目。

swoft目录

对于一个 laravel 老玩家,看这个目录还是比较简单的,env 配置文件使用的时候 copy 一遍,不同的是他这边配置是分为 env、config、bean 三部分,主要开发的代码在 app 下,bin 下放了一些可执行文件。
upload successful

Controller

我是将它作为一个 http 的服务,所以最重要的目录 app/Http/Controller ,每一条 http 请求对应一个 Controller 中的方法。所有 Controller 都需要 @Swoft\Http\Server\Annotation\Mapping\Controller 注解(注释),后面所有提到的注释和注解意义相同,注解是 java 中的称呼,是一些有意义的代码级别含义的标志,方法都需要添加 @Swoft\Http\Server\Annotation\Mapping\RequestMapping 注解

upload successful

Request

1
2
3
4
5
$request = Context::get()->getRequest();
$key = $request->post('key');
$method = $request->getMethod();
$headers = $request->getHeaders();
$some = $request->query('key', 'default value')

这里 $request 可以类比 laravel 对象,

Response

这种大而全的框架其实都是有很多方法获取常见的 request 以及 response 对象的。

全局context获取

1
$response=Context::mustGet()->getResponse()

方法注入

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @RequestMapping("index")
* @param Response $response
* @return Response
* @throws ReflectionException
* @throws ContainerException
*/
public function index(Response $response): Response
{
$response = $response->withContent('<html lang="en"><h1>Swoft framework</h1></html>');
$response = $response->withContentType(ContentType::HTML);
return $response;
}

可以看到使用了 param 注解,并声明 Response 类型。

DB

和 laravel 中一样使用 Eloquent 模型操作数据,但是我没有找到我想要的关联模型相关的方式,例如:belongsTomorphTo 等。

1
2
3
$user = User::query()
->where('mobile', $mobile)
->first();

Redis

这类框架真的互相一大抄,使用的是著名的扩展 predis,毫无悬念。

1
$value = Redis::get('some');

运行

直接运行

其实到这里才是我想说有点坑的地方。

1
$ php bin/swoft http:start

好!稍等片刻,项目是跑起来了,但是我修改代码的时候居然不更新,需要切断进程重新跑。

swoftcli

这也是官方提供的一个工具,可以 watch 文件的变化,然后可以自动重启服务,cli 在老版本是内置的,新版本的 swoft 踢除了。

1
$ php bin/swoftcli run -b bin/swoft /var/www/swoft

不得不说真香,但是在 MacBook 下面修改代码到服务重启成功总是慢半拍,但是试了在 linux 下确实可以做到同步。

容器化

终于要讲到我的大杀器,官方也是提供 Dockerfile 和 docker-compose 的,改了一下 command 就可以正常运行了。

参考文档

-官方文档

坚持原创技术分享,您的支持将鼓励我继续创作!