介绍
这篇文章将为大家详细讲解有关如何在swoole中制作一款仿制laravel的框架,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
首先需要确定一下思路:我希望基于swoole的扩展开发的代码在运行起来的时候,在接收到ws或是tcp等消息时,自动路由到某个类上,同时类可以实现加载类的依赖注入功能。目前市面上占据主流的一款框架laravel,其中有一个依赖注入的功能非常的便捷。一般在通常的框架中拉取类是这样做的:
class a { public 才能;bClassInstance美元; public 才能;function  __construct (Class b), { ,,,classInstance 美元;=,new b (); ,,} public 才能;function  doSth (), { ,,,return $ this→bClassInstance→xxx (); ,,} } $ b =, new b (); $ a =, new (b)美元 一个美元→doSth ();
而在Laravel中则可以省略一些实例化的步骤,直接通过类型约束的语法在方法的形参上指定某类的命名空间就自动实例化该类进来了。
class a { public 才能;function  doSth (b b)美元,{ ,,,return b→美元xxx (); ,,} }
想要实现这一点,必须要了解php的反射机制。反射是一个比较冷门的类,他可以做到:使用名称空间实例化一个类,调用类的方法等,利用这一点,可以构造一个自动装箱的类。
& lt; php ?/* * * *大敌;依赖注入容器,若要执行依赖注入,请确保类包含构造函数! ,*/namespace 应用\服务器; class 容器 { public 才能;美元配置; public 才能;美元反射; public 才能;function  __construct($名称空间) {才能 ,,,试一试 ,,,{ ,,,,,这个→美元reflection =, new \ ReflectionClass($名称空间); ,,,} ,,,catch (Exception $ e) ,,,{ ,,,,,echo $名称空间; ,,,} ,,} public 才能;function  builderController (fn美元,美元的服务器,框架,美元,美元userMessage) {才能 ,,,//从路线中得到的控制名称 ,,,这美元→反思→getMethod (fn)→调用($ this→自动构建(),服务器,美元,美元,,userMessage美元); ,,} public 才能;function  builderTask (fn美元,美元的服务器,userMessage美元) {才能 ,,,这美元→反思→getMethod (fn)→调用($ this→自动构建(),服务器,美元,美元userMessage); ,,} public 才能;function 自动构建() {才能 ,,,#对构造函数赋值 ,,,return $ this→batchInstantiation ($ this→getPrototypeController ($ this→反射)#获得字串 ,,,); ,,} protected 才能final function  getPrototypeController (\ ReflectionClass $对象) {才能 ,,,prototype 美元;=,假; ,,,//批量从反射类中获取原型字串 ,,,foreach (对象→美元getConstructor ()→getparameter (), as 美元参数) ,,,{ ,,,,,原型[],美元=,参数→美元getClass()→名称; ,,,} ,,,return prototype 美元;?:,[]; ,,} protected 才能final function  batchInstantiation (array prototypeArr美元) {才能 ,,,foreach (prototypeArr 美元;as 项目美元) ,,,{ ,,,,,container 美元;=,new 容器($ item); ,,,,,美元insArr[],=,容器→美元自动构建();//进行递归注入 ,,,} ,,,return 空(prototypeArr美元),?,这美元→反思→newInstance (),:, $ this→反思→newInstanceArgs ($ insArr); ,,} }
有了这个简易的装箱类后,可以着手实现类的路由功能,我们首先创建作曲家。json,键入如下内容。
{ “require"才能:,{ , ,,}, “autoload"才能:,{ ,,,“psr-4":, { ,,,“应用\ \“:,“App/? ,,,} ,,} }
下一步,我们需要创建一个处理路由的类,这个类在常规的框架中,一般用来映射http请求到对应的类的函数上,而在swoole里,请求会来自长连接。那么在路线类中则需要做相应的处理。
class 路线 { public 才能;websocketServer美元; 美元public 才能;模型; public 才能;美元缓存; public 才能;function  __construct (), { ,,,这个→美元websocketServer =, new \ swoole_websocket_server (“0.0.0.0",,“8002“); ,,} public 才能;function  start_ws (), { ,,,//,这里设置一些swoole的参数,… ,,,//,最后执行启动swoole ,,,这个→美元websocketServer→开始(); ,,} ,, public 才能;function  ws_onMessage (\ swoole_websocket_server 服务器,美元,美元框架) {才能 ,,,userMessage 美元;=,$ this→filter_arr (json_decode()美元框架→数据,,真的)); ,,,if (! $ userMessage), { null null null null null null null null null null null null null null null null null null如何在swoole中制作一款仿制laravel的框架