在swoole中制作一款仿制laravel的框架的实例代码

 更新时间:2021年03月15日 17:06:13   作者:VE视频引擎  
这篇文章主要介绍了在swoole中制作一款仿制laravel的框架,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

首先需要确定一下思路:我希望基于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 empty($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();

到此这篇关于在swoole中制作一款仿制laravel的框架的文章就介绍到这了,更多相关swoole laravel框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • laravel validate 设置为中文的例子(验证提示为中文)

    laravel validate 设置为中文的例子(验证提示为中文)

    今天小编就为大家分享一篇laravel validate 设置为中文的例子(验证提示为中文),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • php 将bmp图片转为jpg等其他任意格式的图片

    php 将bmp图片转为jpg等其他任意格式的图片

    有时候我们需要将bmp格式的图片转换为jpg或gif等格式,大家就可以参考下下面的代码。
    2009-06-06
  • php中pcntl_fork创建子进程的方法实例

    php中pcntl_fork创建子进程的方法实例

    这篇文章主要介绍了php中pcntl_fork创建子进程的方法实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • PHP在自己框架中引入composer的全过程

    PHP在自己框架中引入composer的全过程

    这篇文章主要给大家介绍了PHP在自己框架中引入composer的全过程,文章通过图文结合给大家介绍的非常详细,对大家的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Zend Framework框架路由机制代码分析

    Zend Framework框架路由机制代码分析

    这篇文章主要介绍了Zend Framework框架路由机制,结合代码分析了Zend Framework路由机制所涉及的控制器,路由器原理与相关代码实现技巧,需要的朋友可以参考下
    2016-03-03
  • 复现WordPress xmlrpc.php漏洞和SSRF的详细步骤

    复现WordPress xmlrpc.php漏洞和SSRF的详细步骤

    这篇文章主要介绍了复现WordPress xmlrpc.php漏洞和SSRF的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • PHP+MYSQL实现读写分离简单实战

    PHP+MYSQL实现读写分离简单实战

    本篇文章主要介绍了PHP+MYSQL实现读写分离,实例分析了读写分离的技巧,从而提高数据库的负载能力,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • ThinkPHP权限认证Auth实例详解

    ThinkPHP权限认证Auth实例详解

    这篇文章主要介绍了ThinkPHP权限认证Auth实例,需要的朋友可以参考下
    2014-07-07
  • PHP框架Laravel学习心得体会

    PHP框架Laravel学习心得体会

    Laravel是一套简洁、优雅的PHP Web开发框架 (PHP Web Framework) 。在世界(不含中国)PHP框架的占有率超过40%。下面通过本文给大家分享我的PHP框架Laravel学习心得体会,欢迎大家给我留言
    2015-10-10
  • Yii2框架自定义类统一处理url操作示例

    Yii2框架自定义类统一处理url操作示例

    这篇文章主要介绍了Yii2框架自定义类统一处理url操作,涉及Yii2框架资源管理与配置相关操作技巧,需要的朋友可以参考下
    2019-05-05

最新评论