文档章节

swoft微服务框架之容器IOC和控制器

stelin
 stelin
发布于 2017/08/24 14:19
字数 1528
阅读 244
收藏 1

什么是swoft?

swoft是基于swoole协程2.x的高性能PHP微服务框架,内置http服务器。框架全协程实现,性能优于传统的php-fpm模式。项目地址: https://github.com/swoft-cloud/swoft

全局容器

每一个被swoft管理的PHP对象称之为Bean,swoft提供了一个IoC容器来初始化对象和获取对象,解决对象间的依赖管理。properties.php可以配置容器相关参数。

return [
    ...
    'autoInitBean' => true,// 是否自动初始化bean,如果false,使用bean时创建Bean,默认是false
    'beanScan' => [ // 配置注解自动扫描的命令空间
        'app\controllers',
        'app\models',
        'app\beans',
    ],
    ...
];

注入对象与引用

目前支持两种方式注入对象,数组配置和@Bean注解。

配置规则

  • 必须定义一个数组KEY且为字符串,KEY及是Bean名称,可以通过名称使用
  • 数组值里面必须有KEY为class,class指定需要注入的类名称
  • 其余数组配置项,若KEY=0且值为自然数组(数组个数对应构造函数参数),则是类构造函数配置,反之是类属性配置,KEY及是类成员名称,属性配置只要不是静态属性都可以。
  • base.php配置顺序没有强力要求,建议按使用顺序配置,方便阅读

引用规则

  • 引用properties.php分递归引用和直接引用两种方式
  • ${beanName}这种方式引用Bean对象
  • 构造函数参数和成员属性都可以使用以上引用规则

数组配置

// properties.php
return [
    'config.service.user.maxActive' => 10,
    'service' =>[
        'user' => [
            'timeout' => 21200
        ]
    ]
];

// base.php
return [
    'config'         => [
        'properties' => require_once __DIR__ . '/' . APP_ENV . '/properties.php',
    ],
    'userProvider' => [
        'class' => \swoft\service\ConsulProvider::class
    ],
    "userPool"  => [
        "class"           => \swoft\pool\ServicePool::class, // 
        [
            '${randomBalancer}', // 构造函数参数,通过引用值使用
            [
                'timeout'=>'${config.service.user.timeout}'
            ],
            'refVal',
        ],
        "uri"             => '127.0.0.1:8099,127.0.0.1:8099', 
        "maxIdel"         => 6,
        "maxActive"       => '${config.service.user.maxActive}', // 直接引用方式使用
        "timeout"         => '${config.service.user.timeout}', // 递归引用使用
        "balancer"        => '${randomBalancer}', //引用已经注入的Bean对象 
        "serviceName"     => 'user',
        "useProvider"     => false,
        'serviceprovider' => '${userProvider}'
    ],
];

注解配置

注解配置更加简洁,通过在类和属性上使用@Bean和@Inject注解。

/**
 *
 * 注解注入demo,如下注入一个名为userModel的bean
 *
 * @Bean("userModel")
 * ...
 */
class UserModel
{
    /**
     * 注入logger
     *
     * @Inject("${logger}")
     * @var Logger
     */
    private $property;

    /**
     * 注入logger
     *
     * @Inject(name="${logger}")
     * @var Logger
     */
    private $property2;

    /**
     * 注入IndexLogic.class,默认注入该属性,对应的类型名(包含命令空间)Bean
     *
     * @Inject()
     * @var IndexLogic
     */
    private $property3;

    /**
     * 注入properties.php值
     * 
     * @Inject("${config.service.user.timeout}")
     * @var int
     */
    private $property4;

    /**
     * 注入properties.php值
     *
     * @Inject(name="${config.user.stelin.steln}")
     * @var string
     */
    private $property5;

    /**
     * 未注入,使用默认值
     *
     * @var string
     */
    private $property6 = "default";


    public function getData()
    {
        return $this->data;
    }
}

@Bean注解

@Bean里面只能使用双引号

@Bean("userModel")或@Bean(name="userModel")含义是一样。

@Bean()这种格式含义是注入的bean名称是使用类名(包含命名空间)。

@Bean(name="beanName",scope=Scope::SINGLETON) 默认注入Bean都是单例,可以scope属性设置其类型

@Inject

@Inject使用格式和@Bean基本一样,注意通过注解目前不支持构造函数参数注入

@Inject("name="${logger}")或@Inject("${logger}")注入名称为logger的Bean到属性

@Inject(name="${config.user.stelin.steln}")注入properties里面配置的值,可以层级和直接方式配置。

@Inject()默认注入该属性,对应的类型名(包含命令空间)Bean

控制器

一个继承\swoft\web\Controller的类既是控制器,控制器有两种注解自动注册和手动注册两种方式。建议使用注解自动注册,方便简洁,维护简单。多次注册相同的路由前者会被后者覆盖。

注解自动注册

注解自动注册常用到三个注解@AutoController、@Inject、@RequestMapping.

@AutoController

已经使用@AutoController,不能再使用@Bean注解。

@AutoController注解不需要指定bean名称,统一类为bean名称

@AutoController()默认自动解析controller前缀,并且使用驼峰格式。

@AutoController(prefix="/demo2")或@AutoController("/demo2")功能一样,两种使用方式。

@Inject

使用和之前的一样

@RequestMapping

@RequestMapping(route="/index2")或@RequestMapping("/index2")功能一样两种方式使用,这种默认是支持get和post方式

@RequestMapping(route="/index2", method=RequestMethod::GET)注册支持的方法

不使用@RequestMapping或RequestMapping()功能一样,都是默认解析action方法,以驼峰格式,注册路由。

/**
 * 控制器demo
 *
 * @AutoController(prefix="/demo2")
 *
 * @uses      DemoController
 * @version   2017年08月22日
 * @author    stelin <phpcrazy@126.com>
 * @copyright Copyright 2010-2016 swoft software
 * @license   PHP Version 7.x {@link http://www.php.net/license/3_0.txt}
 */
class DemoController extends Controller
{
    /**
     * 注入逻辑层
     *
     * @Inject()
     * @var IndexLogic
     */
    private $logic;

    /**
     * 定义一个route,支持get和post方式,处理uri=/demo2/index
     *
     * @RequestMapping(route="index", method={RequestMethod::GET, RequestMethod::POST})
     */
    public function actionIndex()
    {
        // 获取所有GET参数
        $get = $this->get();
        // 获取name参数默认值defaultName
        $name = $this->get('name', 'defaultName');
        // 获取所有POST参数
        $post = $this->post();
        // 获取name参数默认值defaultName
        $name = $this->post('name', 'defaultName');
        // 获取所有参,包括GET或POST
        $request = $this->request();
        // 获取name参数默认值defaultName
        $name = $this->request('name', 'defaultName');
        //json方式显示数据


        $this->outputJson("suc");
    }

    /**
     * 定义一个route,支持get,以"/"开头的定义,直接是根路径,处理uri=/index2
     *
     * @RequestMapping(route="/index2", method=RequestMethod::GET)
     */
    public function actionIndex2()
    {
        // 重定向一个URI
        $this->redirect("/login/index");
    }

    /**
     * 没有使用注解,自动解析注入,默认支持get和post,处理uri=/demo2/index3
     */
    public function actionIndex3()
    {
        $this->outputJson("suc3");
    }
}

手动注册

手动注册常用@Bean、@Inject注解,手动注册还要多一步就是在routes.php里面注册自己的路由规则。

手动注册@Bean()只能这样缺省方式。并且不能使用@AutoController注解

/**
 * 控制器demo
 *
 * @Bean()
 *
 * @uses      DemoController
 * @version   2017年08月22日
 * @author    stelin <phpcrazy@126.com>
 * @copyright Copyright 2010-2016 swoft software
 * @license   PHP Version 7.x {@link http://www.php.net/license/3_0.txt}
 */
class DemoController extends Controller
{
    /**
     * 注入逻辑层
     *
     * @Inject()
     * @var IndexLogic
     */
    private $logic;

    /**
     * uri=/demo2/index
     */
    public function actionIndex()
    {
        // 获取所有GET参数
        $get = $this->get();
        // 获取name参数默认值defaultName
        $name = $this->get('name', 'defaultName');
        // 获取所有POST参数
        $post = $this->post();
        // 获取name参数默认值defaultName
        $name = $this->post('name', 'defaultName');
        // 获取所有参,包括GET或POST
        $request = $this->request();
        // 获取name参数默认值defaultName
        $name = $this->request('name', 'defaultName');
        //json方式显示数据


        $this->outputJson("suc");
    }

    /**
     * uri=/index2
     */
    public function actionIndex2()
    {
        // 重定向一个URI
        //        $this->redirect("/login/index");
        $this->outputJson("suc2");
    }

    /**
     */
    public function actionIndex3()
    {
        $this->outputJson("suc3");
    }
}

routes.php手动注册路由

// ...

$router->map(['get', 'post'], '/demo2/index', 'app\controllers\DemoController@index');
$router->get('/index2', 'app\controllers\DemoController@index2');
$router->get('/demo2/index3', 'app\controllers\DemoController@index3');

© 著作权归作者所有

共有 人打赏支持
stelin
粉丝 10
博文 5
码字总数 4467
作品 1
成都
私信 提问
高性能 PHP 微服务框架 - Swoft

Swoft swoft 是基于 swoole 协程 2.x 的高性能 PHP 微服务框架,内置 http 服务器。框架全协程实现,性能优于传统的 php-fpm 模式。 基于 swoole 易扩展 内置 http 协程服务器 MVC 分层设计 ...

stelin
2017/08/11
677
2
分布式框架微服务架构 - Shockweb

ShockWeb天网微服务架构是高效的、易用的、可控的分布式框架微服务架构。提供无侵入、无依赖开发模式,易于在主流中间件部署。支持有状态、无状态两种模式,支持原生IOC、 Spring IOC容器。设...

辛巴8
04/18
0
0
【上海】OSC源创会第75期报名开始

本期图文回顾链接:https://www.oschina.net/question/3802184_2280606 春暖花开的五月,OSC源创会将来到繁华的上海与你相约,依然秉持着“自由,开放,分享”的思想,为大家带来非常精彩的【...

小鱼丁
04/26
204
79
spring、springMvc、springBoot和springCloud的联系与区别

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/80656687 spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,...

尘光掠影
06/11
0
0
swoole框架-swoft初体验

swoole框架-swoft初体验 没有swoole之前,php一直被"誉“为世界上最好的语言。swoole横空出世后,php就成了宇宙最好的语言了... 关于swoole的基础使用,详见 2018年swoole实战1-初识swoole ...

章鱼喵_
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript执行环境及作用域(三)——没有块级作用域

JavaScript中没有块级作用域经常会导致理解上的困惑,在其他类C的语言中,由花括号封闭的代码都有自己的作用域,因而支持根据条件来定义变量。但是在JavaScript中下面的代码并不会得到想象中...

Bob2100
3分钟前
0
0
Kafka流式处理

Kafka Streams 初识流式处理 什么是数据流 数据流(也叫事件流)是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新记录会不断加...

东都大狼狗
8分钟前
0
0
Mysql主从复制(拓展博客文章扩充知识面)

#不停库不锁表在线主从配置 使用 Xtrabackup 在线对MySQL做主从复制 1.数据量大的话还是建议使用工具例如xtrabackup,mysqldump比较适合操作10G以下的数据备份复制。 2.做业务之前考虑清楚具...

robertt15
13分钟前
0
0
docker快速搭建几个常用的第三方服务

本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch; 如果想学习Java工程化、...

编程SHA
46分钟前
5
0
我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

linuxprobe16
54分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部