swoft微服务框架之容器IOC和控制器
2017-08-24 00:00
615 查看
什么是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');
相关文章推荐
- 构建插件式的应用程序框架(四)----服务容器
- 一起写框架-Ioc内核容器的实现-对象的调用-@Bean注解注入容器的对象(十二)
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- 跟我动手搭框架一之IOC容器实现
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- 基于nutz框架理解Ioc容器
- YII框架的依赖注入容器与服务定位器简述
- Swoole微服务框架Swoft之ORM
- 基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架 推荐
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)
- ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析
- [置顶] 【SSH】SSH框架(三)——Spring IOC和AOP的容器框架
- 框架学习—Spring的IoC容器之XML方式
- 一起写框架-Ioc内核容器的实现-基础功能-getBean(五)
- Dhroid框架六大组件之Ioc容器【下】
- 基于J2EE轻量级容器构件框架三、控制器部分
- 在WCF中使用Ninject轻量级IOC框架 之 SOAP风格服务
- 依赖注入(DI)与服务容器(IoC)
- IOC容器在框架中的应用