说明

php7由于新框架须要安装swoole,只能linux环境运行,这里本机开发是win10(:debian云服务器主机上git clone 项目,再同步到本机phpstorm、修改提交;或使用win10的docker安装)。

这里docker有个bug:无法感知主机文件的热更新,所以运行加了 --rm 选项,手动热启动。

1.安装

官方提供docker方式简便快捷:

(git clone https://github.com/swoft-clou... 下载swoft到目标文件夹,如/root/tmp/dk/vuejs/swoft)

#/root/tmp/dk/vuejs/swoft 为当前swoft主机映射目录

#启动项目的http访问,启动命令情况参考根目录的Dockerfile文件

docker run -p 18306:18306 --name swoft -v /root/tmp/dk/vuejs/swoft:/var/www/swoft --rm swoft/swoft

2.http访问请求

a.http响应

复制 .env.example 为 .env ,修改参数为调试模式;端口配置在 app/bean.php 不修改。

参考HomeController和官网说明,添加控制器 app/Http/Controller/TestController.php:

namespace App\Http\Controller;

use Swoft\Context\Context;

use Swoft\Http\Message\ContentType;

use Swoft\Http\Message\Response;

use Swoft\Http\Server\Annotation\Mapping\Controller;

use Swoft\Http\Server\Annotation\Mapping\RequestMapping;

use Throwable;

/**

* 测试类

*

* @Controller("/test")

*/

class TestController

{

/** 网络地址 http://host:18306/test/a

* @RequestMapping("/test/a")

* @throws Throwable

*

* 方法注释

*/

public function index(): Response

{

return Context::mustGet()->getResponse()->withContentType(ContentType::HTML)->withContent("12345");

}

}

这里请求返回:获取协程上下文->获取响应对象->包含HTML头部的字符串。

注解路由:

从启动文件 bin/swoft 一直ctrl+点击下去,可以看到启动配置文件后,注解路由类的加载。

[

new EnvProcessor($this),

new ConfigProcessor($this),

new AnnotationProcessor($this),

new BeanProcessor($this),

new EventProcessor($this),

new ConsoleProcessor($this),

]

初始化加载流程:

(new AppApplication()) ==> __construct()->$this->init() ==> $this->processors() => new [] :实例化上面4个启动类;

AnnotationRegister::load() ==> AnnotationResource()->load()..loadAnnotation()..parseAnnotation()..parseOneClassAnnotation() ==> DoctrineCommonAnnotationsAnnotationReader ,扫描注解类。

b.http中间件

参考官网,配置文件 app/bean.php 里 httpDispatcher['middlewares'] 是http请求分发时的中间件,可以在此配置出添加类名、模拟ViewMiddleware.php编写中间件。

默认已经有个空的未加入,添加到配置 app/bean.php:

'httpDispatcher' => [

// Add global http middleware

'middlewares' => [

// Allow use @View tag

\App\Http\Middleware\ControllerMiddleware::class,

\Swoft\View\Middleware\ViewMiddleware::class,

],

],

并修改它app/Http/Middleware/ControllerMiddleware.php:

namespace App\Http\Middleware;

use Psr\Http\Message\ResponseInterface;

use Psr\Http\Message\ServerRequestInterface;

use Psr\Http\Server\RequestHandlerInterface;

use Swoft\Bean\Annotation\Mapping\Bean;

use Swoft\Context\Context;

use Swoft\Http\Message\Response;

use Swoft\Http\Server\Contract\MiddlewareInterface;

use Throwable;

/**

* Class ControllerMiddleware - The middleware of httpDispatcher

*

* @Bean()

*/

class ControllerMiddleware implements MiddlewareInterface

{

/**

* Process an incoming server request.

*

* @param ServerRequestInterface $request

* @param RequestHandlerInterface $handler

*

* @return ResponseInterface

* @inheritdoc

* @throws Throwable

*/

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface

{

/** @var Response $response */

$status = 2;

$date = date("Y-m-d H:i:s ");

if ( $status == 0 ) {

//直接处理之后的 响应

$response = $handler->handle($request);

var_dump($response);

return $response->withData($date); //已完成、处理无效

return $response;

} elseif ( $status == 1) {

//验证失败的 响应

$json = ['code'=>0,'msg'=>'授权失败','time'=>$date];

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

return $response->withData($json);

} elseif ( $status == 2 ) {

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

return $response->withData("ok")->withStatus(404);

} else {

$method = $request->getMethod();

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

return $response->withData($method);

}

}

}

访问浏览器,可看到响应的结果。加到启动配置 httpDispatcher 里的会在 onRequest准备返回前 加载。

withData():如果是string类型:会放到返回数组的data字段里,数组类型:原样返回。

c.RESTful API

由于swoft使用的是注解路由,请求方式也在注解中添加。

编辑器中点击 @RequestMapping() 注解,可以看到有method私有属性,公共方法getMethod() Array。

## app/Http/Controller/TestController.php:

use Swoft\Http\Server\Annotation\Mapping\RequestMethod;

/**

* @RequestMapping(route="/test/rs", method={RequestMethod::POST, RequestMethod::PUT})

* @throws Throwable

*

* 方法注释

*/

public function restful(): Response

{

//SwoftTest\Http\Server\Testing\Controller\RouteController

//* @RequestMapping("method", method={RequestMethod::POST, RequestMethod::PUT})

//Swoft\Devtool\Http\Controller\GenController

//* @RequestMapping(route="preview", method=RequestMethod::POST)

return Context::mustGet()->getResponse()->withContentType(ContentType::HTML)->withContent("hiaa");

}

}

## app/Http/Middleware/ControllerMiddleware.php:

namespace App\Http\Middleware;

use Psr\Http\Message\ResponseInterface;

use Psr\Http\Message\ServerRequestInterface;

use Psr\Http\Server\RequestHandlerInterface;

use Swoft\Bean\Annotation\Mapping\Bean;

use Swoft\Context\Context;

use Swoft\Http\Message\Response;

use Swoft\Http\Server\Contract\MiddlewareInterface;

use Throwable;

/**

* Class ControllerMiddleware - The middleware of httpDispatcher

*

* @Bean()

*/

class ControllerMiddleware implements MiddlewareInterface

{

/**

* Process an incoming server request.

*

* @param ServerRequestInterface $request

* @param RequestHandlerInterface $handler

*

* @return ResponseInterface

* @inheritdoc

* @throws Throwable

*/

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface

{

/** @var Response $response */

$date = date("Y-m-d H:i:s ");

$method = $request->getMethod();

$router = \Swoft\Bean\BeanFactory::getSingleton('httpRouter');

$uriPath = $request->getUriPath();

$routeData = $router->match($uriPath, $method);

if( $routeData[0] == \Swoft\Http\Server\Router\Router::NOT_FOUND ){

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

var_dump(1111111);

return $response->withData([$method ."拒绝访问"]);

}

$status = 0;

if ( $status == 0 ) {

//直接处理之后的 响应

$response = $handler->handle($request);

var_dump("直接响应");

return $response->withData($date); //已完成、处理无效

return $response;

} elseif ( $status == 1) {

//验证失败的 响应

$json = ['code'=>0,'msg'=>'授权失败','time'=>$date];

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

return $response->withData($json);

} elseif ( $status == 2 ) {

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

return $response->withData("ok")->withStatus(404);

} else {

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

return $response->withData($method);

}

}

}

中间件的控制官方没有手册,头大。

php swoft 路由,(swoft-2.x框架)1、使用入门相关推荐

  1. php swoft 路由,Swoft 源码解读

    PHP 里面的 yii/laravel 框架算是非常「重」的了. 这里的 重 先不具体到 性能 层面, 主要是框架的设计思想和框架集成的服务, 让框架可以既可以快速解决很多问题, 又可以轻松扩展. P ...

  2. Android 的媒体路由功能应用与框架解析 MediaRouter

    一.功能描述 Android的媒体路由API被设计用来允许多种媒体(视频.音乐.图片)在与ANDROID设备连接(无线或有线)的辅助设备(如电视.立体声.家庭戏院系统.音乐播放机)上显示和播放,使用该 ...

  3. Android 的媒体路由功能应用与框架解析

    一.功能描述 Android 的媒体路由API被设计用来允许多种媒体(视频.音乐.图片)在与ANDROID设备连接(无线或有线)的辅助设备(如电视.立体声.家庭戏院系统.音乐播放机)上显示和播放,使用 ...

  4. 分布式应用框架Akka快速入门

    转自:分布式应用框架Akka快速入门_jmppok的专栏-CSDN博客_akka 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料在最后列出. 1.什么是Akk ...

  5. ❤️《Vue前端基础框架集合从入门到高级》(小白也可学,建议收藏)❤️

    <Vue前端基础框架集合从入门到高级>,小白也可学 文章目录 <Vue前端基础框架集合从入门到高级>,小白也可学 ❤️一.前端核心分析 ❤️1.1.概述 ❤️1.2.前端三要素 ...

  6. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)--初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  7. 视频教程-Python框架Djanggo从入门到实战教程(企业级项目实战)-Python

    Python框架Djanggo从入门到实战教程(企业级项目实战) 多年web开发经验,精通HTML.CSS.JavaScript.HTML5.CSS3等Web前端开发技术,技术纯熟,项目经验丰富.授课 ...

  8. php yii2框架教程,Yii2框架使用快速入门

    Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用. 因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用, 如门户网站.社区.内容管理系统(CM ...

  9. 【新闻推荐系统】(task4)Flask框架基础与入门

    学习总结 继续我们的新闻推荐系统,本个task是学习系统后端构建之Flask及其基本使用.算法工程师需要了解一些关于开发的知识,因为在实际的工作中经常调试线上的代码来调用策略或模型. 一般来说,URL ...

最新文章

  1. 让资源管理器不显示最近常用文件夹
  2. 用一条sql取得第10到第20条的记录-Mssql数据库
  3. Net平台下的分布式缓存设计
  4. python 抓取网页(一)
  5. SAP HANA会代替BW吗?
  6. Beetl 模板引擎学习
  7. 鸿蒙手表怎么安装,万物皆可鸿蒙,这次鸿蒙系统将应用到手表上了
  8. 常用数据挖掘算法举例(下)
  9. 队列实现max操作,要求尽量提高效率。
  10. reids实现分布式锁两种方式,单机,集群
  11. 支付宝客户端java版_支付宝对接支付-JAVA版
  12. Java中static的用法,初始化块
  13. convertTO函数 简介
  14. 抖音最火的微信推送教程
  15. 【190302】VC+ 视频捕捉与录像+实例源码源代码
  16. cad修改快捷键_CAD快捷键,提高绘图速度
  17. 支付宝内部功能调用APP的said说明(转载)
  18. 一次性餐具 disposable dishware
  19. win11磁盘分区怎么分?手把手教会你
  20. 网站页面代码优化的方法有哪些呢?

热门文章

  1. 生成VBAK-UPD_TMSTMP的TIMESTAMP TIMESTAMPL示例
  2. arm mali 天梯图_ARM发飙!最强移动CPU/GPU来了:一图懂
  3. \\u559c\\u6b22\\u4e00\\u4e2a\\u4eba unicode编码问题
  4. 怎么通过IP地址找MAC
  5. POP3协议规范(中文版)
  6. 20141115 【 Arduino - LM35 - 4位八段数码管 】 数码管显示温度
  7. 项目管理计算-- PV、EV、AC、BAC、EAC、ETC等计算公式含义
  8. 【PMP】挣值管理(PV、EV、AC、SPI、CPI、BAC、EAC、ETC、TCPI)
  9. 永磁直流无刷电机设计之路(一)——概述
  10. 案例丨人大金仓KINGBASE助力国家能源集团186个新能源场站新集控系统上线