文档章节

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

stelin
 stelin
发布于 2017/08/24 14:19
字数 1528
阅读 199
收藏 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
swoole框架-swoft初体验

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

章鱼喵_
07/31
0
0
Spring体系常用项目一览

如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪。 Spring Spring 概述 Spring...

MageekChiu
2017/09/24
0
0
Java和微服务-杂谈

前段时间,在学习docker的时候,和一同事聊的时候,同事开玩笑说:为啥java写的应用,要分配内存资源的动不动就要个4G的啥?额,之前一直没有想过这个问题,Java啊,跑在服务器上的时候,轻轻...

alex
2016/12/02
34
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis应用之分布式锁(set)

Redis应用之分布式锁(set) 在单机应用的场景下,我们常使用的锁主要是synchronized与Lock;但是在分布式横行的大环境下,显然仅仅这两种锁已经无法满足我们的需求; 需求:秒杀场景下,有若干...

GMarshal
32分钟前
1
0
python实现简单的文件加密与解密

对于任意的一个文件,本质上来讲都是二进制的。 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m; 如果再讲上面得到的e用m进行...

Aomo
34分钟前
1
0
Android开发应用程序生成以太坊钱包

Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚: 1.在app/build.gradle中集成以下依赖项: compile ('org.web3j:core-android:2.2.1') web3j核心是...

geek12345
49分钟前
1
0
ArrayList嘿嘿嘿

数组扩容技术: //扩容技术 将原数组objs类容复制到新数组并且长度为11 Object[] newObjs = Arrays.copyOf(objs,11); 数组比较大那么System.arraycopy比较有优势,因为其使用的是内存复制,省...

熊猫你好
今天
2
0
Android平台下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

python版的sxtwl_cpp传送入口 在build.gradle的allprojects中加入 maven { url 'https://dl.bintray.com/yuangu/sxtwl' } 最终如下面代码所示: allprojects { repositories { ......

元谷
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部