微擎使用slim框架做插件

@admin  October 8, 2019

微擎模块定制修改,联系156-2118-6790

Slim是一个PHP微框架,可帮助您快速编写简单但强大的Web应用程序和API。官网

微擎是一家开源的公众平台SAAS领域技术服务提供商,我们可以把自己的产品做成插件形式集成到微擎的插件上

为什么使用slim

slim 简单,健壮,符合psr规范可以方便的使用composer 把优秀的代码包集成到自己的项目中,还有依赖注入可以解耦负载的业务逻辑

slim 的默认路由是需要伪静态支持的,比如访问 http://xxx.com/admin/index/index

集成的第一步需要修改slim 的路由方式,方法就是重写路由类


    use Slim\Router as SRouter;
    use Psr\Http\Message\ServerRequestInterface;
    
    class Router extends SRouter
    { 
        public function dispatch(ServerRequestInterface $request)
        {
            $uri =  ltrim($request->getParam("r"), '/');
             
            return $this->createDispatcher()->dispatch(
                $request->getMethod(),
                $uri
            );
        }
    
    }

然后再实例化App 的时候将新的路由注入到App中

    $config = [];
    $config["router"] = (new Router());
    $app = new \Slim\App( $config );
    $app->run();

其实上述代码的逻辑就是把原本伪静态的内容,交由一个GET参数传入,这里我设置的是参数 r
实现的逻辑是 http://xxx.com/admin/index/index 等于 http://xxx.com/?r=admin/index/index

伪静态的问题解决了,接下来就是怎么集成到微擎模块上,

以下几个文件需要了解下
模块/site.php
模块/module.php
模块/install.php
模块/uninstall.php
模块/manifest.xml

这个文件是制作模块必须的依赖文件,有标识应用名称,应用权限等功能

其中site.php 文件是应用访问的入口,可以根据这个来初始化slim应用

    class mmc_ssoModuleSite extends WeModuleSite
    { 
    
        public function doWebWeb()
        {
            global $app;
                mmc_run($app);
        } 
    
        public function doMobileApp()
        {
                global $app;
                mmc_run($app);
        }
         
    }

路由可以自定义比如

         $app->group("",function($c){  
            $r = $c->getContainer()->request->getParam("r"); 
            $rArr = explode(".",$r); 
            $class = '\\yidui'; 
            $len = count($rArr);
            for($i = 0;$i<$len;$i++){ 
                $item = $rArr[$i];
                if($i == $len-1){
                    if(class_exists($class)){  
                        $class .= ":".$item;
                    }else{
                        return;
                    }
                }
                else if($i == $len-2){
                    $class .= '\\'.ucfirst($item);
                }
                else{
                    $class .= '\\'.$item;    
                }
            } 
            $app->any($r,$class);
        });

    

应用访问的路径如果是: /web/index.php?c=site&a=entry&m=mmc_sso&do=web&r=admin.index.index

那么他会访问 \yidui\admin\Index 类下的 index function

微擎模块定制修改,联系156-2118-6790

人人商城修改,联系156-2118-6790


添加新评论