在swoole中制作一款仿制laravel的框架的实例代码
发布:smiling 来源: PHP粉丝网 添加日期:2022-04-18 10:23:41 浏览: 评论:0
首先需要确定一下思路:我希望基于swoole的扩展开发的代码在run起来的时候,在接收到ws或是tcp等消息时,自动路由到某个类上,同时类可以实现加载类的依赖注入功能,目前市面上占据主流的一款框架Laravel,其中有一个依赖注入的功能非常的便捷,一般在通常的框架中拉取Class是这样做的:
- class a {
- public $bClassInstance;
- public function __construct(Class b) {
- $classInstance = new b();
- }
- public function doSth() {
- return $this->bClassInstance->xxx();
- }
- }
- $b = new b();
- $a = new a($b)
- $a->doSth();
而在Laravel中则可以省略一些实例化的步骤, 直接通过类型约束的语法在方法的形参上指定某类的命名空间就自动实例化该类进来了。
- class a {
- public function doSth(b $b) {
- return $b->xxx();
- }
- }
想要实现这一点,必须要了解php的反射机制。反射是一个比较冷门的类,他可以做到:使用namespace实例化一个类、调用类的方法等,利用这一点,可以构造一个自动装箱的类。
- <?php
- /***
- * 依赖注入容器,若要执行依赖注入,请确保类包含构造函数!
- */
- namespace App\Server;
- class Container
- {
- public $config;
- public $reflection;
- public function __construct($namespace)
- {
- try
- {
- $this->reflection = new \ReflectionClass($namespace);
- }
- catch (Exception $e)
- {
- echo $namespace;
- }
- }
- public function builderController($fn, $server, $frame, $userMessage)
- {
- //从route中得到的control名称
- $this->reflection->getMethod($fn)->invoke($this->autoBuilder(), $server, $frame, $userMessage);
- }
- public function builderTask($fn, $server, $userMessage)
- {
- $this->reflection->getMethod($fn)->invoke($this->autoBuilder(), $server, $userMessage);
- }
- public function autoBuilder()
- {
- #对构造函数赋值
- return $this->batchInstantiation($this->getPrototypeController($this->reflection)#获得字串
- );
- }
- protected final function getPrototypeController(\ReflectionClass $object)
- {
- $prototype = false;
- //批量从反射类中获取原型字串
- foreach ($object->getConstructor()->getParameters() as $parameter)
- {
- $prototype[] = $parameter->getClass()->name;
- }
- return $prototype ?: [];
- }
- protected final function batchInstantiation(array $prototypeArr)
- {
- foreach ($prototypeArr as $item)
- {
- $container = new container($item);
- $insArr[] = $container->autoBuilder();//进行递归注入
- }
- return emptyempty($prototypeArr) ? $this->reflection->newInstance() : $this->reflection->newInstanceArgs($insArr);
- }
- }
有了这个简易的装箱类后,可以着手实现类的路由功能,我们首先创建composer.json,键入如下内容。
- {
- "require": {
- },
- "autoload": {
- "psr-4": {
- "App\\": "App/"
- }
- }
- }
下一步,我们需要创建一个处理路由的类,这个类在常规的框架中,一般用来映射http请求到对应的类的函数上,而在swoole里,请求会来自长连接。那么在route类中则需要做相应的处理。
- class Route
- {
- public $websocketServer;
- public $model;
- public $cache;
- public function __construct() {
- $this->websocketServer = new \swoole_websocket_server("0.0.0.0", "8002");
- }
- public function start_ws() {
- // 这里设置一些swoole的参数 ...
- // 最后执行启动swoole
- $this->websocketServer->start();
- }
- public function ws_onMessage(\swoole_websocket_server $server, $frame)
- {
- $userMessage = $this->filter_arr(json_decode($frame->data, true));
- if (!$userMessage) {
- return false;
- }
- if (!$userMessage['type'] || !$userMessage['action']) {
- return $this->call_shell("Type or action not found! ");
- }
- //使用依赖注入容器做伪路由
- $App = new Container('\App\Controller\\'.$userMessage['type']);
- return $App->builderController($userMessage['action'], $server, $frame,$userMessage);
- }
- }
最后一步,创建一个入口文件,引导路由类的执行。
- <?php
- require "vendor/autoload.php";
- use App\Server\Route;
- $App = new Route();
- $App->start_ws();
Tags: swoole laravel
- 上一篇:laravel与thinkphp之间的区别与优缺点
- 下一篇:最后一页
相关文章
- ·Swoole-1.7.22 版本已发布,修复PHP7相关问题(2021-07-03)
- ·Swoole 1.10.0新版本发布,增加了多项新特性(2021-08-29)
- ·LaravelS通过Swoole加速Laravel/Lumen详解(2021-09-04)
- ·在Laravel5.6中使用Swoole的协程数据库查询(2021-10-01)
- ·Swoole 5将移除自动添加Event::wait()特性详解(2021-12-04)
- ·Laravel使用swoole实现websocket主动消息推送的方法介绍(2022-01-14)
- ·Laravel 5.6中的CURD操作(代码示例详解)(2020-01-15)
- ·如何在laravel 5中创建用于XSS防御的中间件? (2020-01-16)
- ·关于Laravel重定向的七种方法详解(2020-01-26)
- ·如何在laravel 5中使用DB事务?(2020-01-31)
- ·Laravel中如何给图片加水印?(2020-04-05)
- ·Laravel框架数据库CURD操作、连贯操作总结(2021-04-10)
- ·Laravel框架路由配置总结、设置技巧大全(2021-04-10)
- ·Laravel框架中扩展函数、扩展自定义类的方法(2021-04-10)
- ·跟我学Laravel之快速入门(2021-04-16)
- ·跟我学Laravel之安装Laravel(2021-04-16)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)