autumn / autumn-framework
Autumn Framework
Requires
- php: >=7.0
- ext-swoole: >=1.7.7
- bulton-fr/dependency-tree: ^1.1
- doctrine/annotations: ^1.4
- doctrine/dbal: ^2.5
- mintware-de/json-object-mapper: ^1.2
- psr/log: ^1.0
Requires (Dev)
- phpunit/phpunit: ^5.7
This package is auto-updated.
Last update: 2024-09-26 13:59:28 UTC
README
Autumn Framework是一个基于PECL/Swoole的微服务框架。
Autumn Framework是基于PECL/Swoole的微服务框架。
入门指南
1.导入:
1.导入:
composer require autumn/autumn-framework
2.在composer.json中加入自定义的项目名称空间(如:Market):
2.在composer.json中加入自定义的项目名称空间(如:Market):
// ... "autoload": { "psr-4": { "Market\\": "src" } } // ...
3.创建index.php
3.编写index.php:
<?php require __DIR__ . '/vendor/autoload.php'; exit(Autumn\Framework\Boot\AutumnApplication::run($argc, $argv));
4.创建模型类(简单的常规PHP类):
4.创建模型类(简单的常规PHP类):
namespace Market; class Car { public $id; }
注意:自0.1.0开始,我们使用mintware-de/json-object-mapper作为默认的JSON对象序列化及反序列化工具。无法使用该代码包时(例如版权问题),框架使用json_encode()
函数作为备选。
注意:自0.1.0开始,我们使用mintware-de/json-object-mapper作为默认的JSON对象序列化及反序列化工具。无法使用该代码包时(例如版权问题),框架使用json_encode()
函数作为备选。
5.创建控制器类(POPO):
5.创建控制器类(POPO):
namespace Market; use \Autumn\Framework\Annotation\RestController; use \Autumn\Framework\Annotation\RequestMapping; /** * @RestController */ class CarController { /** * @RequestMapping(value="/cars", method="GET") */ public function list() { $cars = []; for ($i=1; $i<=10; ++$i) { $car = new Car(); $car->id = $i; $cars[] = $car; } return $cars; } }
当请求"GET /cars"时响应10辆车。
当请求"GET /cars"时响应10辆车。
6.启动微服务:
6.启动微服务:
php index.php
7.享受使用
curl -i https://:3028/cars
定义一个Bean并将其注入到属性中(自0.1.0起):
1.创建Configuration类并定义Bean:
1.创建Configuration类,定义Bean:
use \Autumn\Framework\Context\Annotation\Configuration; use \Autumn\Framework\Context\Annotation\Bean; /** * Main Configuration * * @Configuration */ class DaTrieConfiguration { /** @Bean */ public function daTrieService() { // Implementation of interface DaTrieServer return new DaTrieServiceImpl(); } }
2.将Bean注入到类属性上:
2.注入到类属性上:
use \Autumn\Framework\Annotation\RestController; use \Autumn\Framework\Annotation\RequestMapping; use \Autumn\Framework\Context\Annotation\Autowired; /** * @RestController */ class SearchInController { /** @Autowired(value=DaTrieService::class) */ private $daTrieService; }
在方法上使用@Autowired
注解(自0.2.0起):
use \Autumn\Framework\Annotation\RestController; use \Autumn\Framework\Annotation\RequestMapping; use \Autumn\Framework\Context\Annotation\Autowired; /** * @RestController */ class SearchInController { private $daTrieService; /** * @Autowired */ public function setDaTrieService(DaTrieService $daTrieService) { $this->daTrieService = $daTrieService; } }
获取请求数据(自0.2.0起):
在动作方法上为参数添加@RequestBody
注解:
在动作方法上为某个参数定义@RequestBody
注解:
namespace Market; use \Autumn\Framework\Annotation\RestController; use \Autumn\Framework\Annotation\RequestMapping; use \Autumn\Framework\Web\Bind\Annotation\RequestBody; /** * @RestController */ class CarController { /** * @RequestMapping(value="/comments", method="POST") * @RequestBody(value="carId") */ public function create(string $carId) { // ... } }
注意:目前仅支持string
类型的变量。
注意:目前仅支持string
类型的变量。
在所有Bean加载完成后执行某些操作(自0.2.0起):
创建接口ContextRefreshedEventApplicationListener
的派生类:
创建接口ContextRefreshedEventApplicationListener
的派生类:
namespace Market; use \Autumn\Framework\Context\Listener\ContextRefreshedEventApplicationListener; use \Autumn\Framework\Context\Event\ContextRefreshedEvent; class LoadCommentsApplicationListener implements ContextRefreshedEventApplicationListener { public function onApplicationEvent(ContextRefreshedEvent $event) { // Load comments } }
在协程中连接到MySQL服务器(自0.2.0起):
1.定义MySqlOperations
接口的Bean:
1.定义MySqlOperations
接口的Bean:
use \Autumn\Framework\Context\Annotation\Configuration; use \Autumn\Framework\Context\Annotation\Bean; use \Autumn\Framework\Swoole\Coroutine\MySql\MySqlTemplate; /** * Main Configuration * * @Configuration */ class MainConfiguration { /** @Bean */ public function mySqlOperations() { return new MySqlTemplate([ 'host' => 'localhost', 'port' => 3306, 'user' => 'root', 'password' => '', 'database' => 'test', ]); } }
2.注入到类并使用:
2.注入类并使用:
namespace Market; use \Autumn\Framework\Swoole\Coroutine\MySql\MySqlOperations; class CarService { /** @Autowired(value=MySqlOperations::class) */ private $mySqlOperations; const LIST_ALL_SQL = "SELECT * FROM `cars` WHERE `id`>?"; public function listCars() { $generator = $this->mySqlOperations->queryAll(self::LIST_ALL_SQL, function($row) { $car = new Car(); $car->id = $row['id']; return $car; }, 'id'); $cars = []; foreach ($generator as $car) { // ... $cars[] = $car; } return $cars; } }
注意:我们强烈建议在控制器的动作方法中使用此功能。
注意:这项特性目前仅建议使用在控制器的动作方法中。
其他更改:
0.2.0
- 接口
FactoryBean
。 - 访问日志。
- 在日志消息中添加对
{xxx}
占位符的支持; - 日志中支持
{xxx}
占位符; - 捕获异常时显示堆栈信息。
- 捕获异常时显示堆栈调用;
DbalTemplate
(需要安装包Doctrine/DBAL
)。
额外依赖:
查看:
- Autumn 示例
- 双数组Trie服务器
- Spring
- Spring实战