autumn/autumn-framework

v0.2.0 2019-01-02 11:44 UTC

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)。

额外依赖:

查看: