Graent.Hu 的博客

新浪微薄腾讯微薄

最新碎语:最近感觉有些迷茫,怎么办~

您的位置:Graent.Hu 的博客 >PHP编程> ThinkPHP5垮模块调用控制器使用controller的方法

ThinkPHP5垮模块调用控制器使用controller的方法

TIM截图20191111105545.jpg

首先在此前的版本3.*的时候调用是使用A方法实现的,如下:

$IndexController = A("index");
return $IndexController->index();
而在tp5的时候,取消的A方法,取而代之的是controller,其方法代码为:

/**
 * 用于实例化访问控制器
 * @param string $name 控制器名
 * @param string $path 控制器命名空间(路径)
 * @return Think\Controller|false
 */
function controller($name,$path=''){
    $layer  =   C('DEFAULT_C_LAYER');
    if(!C('APP_USE_NAMESPACE')){
        $class  =   parse_name($name, 1).$layer;
        import(MODULE_NAME.'/'.$layer.'/'.$class);
    }else{
        $class  =   ( $path ? basename(ADDON_PATH).'\\'.$path : MODULE_NAME ).'\\'.$layer;
        $array  =   explode('/',$name);
        foreach($array as $name){
            $class  .=   '\\'.parse_name($name, 1);
        }
        $class .=   $layer;
    }
    if(class_exists($class)) {
        return new $class();
    }else {
        return false;
    }
}
同时在同一个控制器下的使用是如下方式:

 $index = controller('Index');
 return $index->index();
在不同的控制器或者模块下的使用是如下的情况:
$cont = controller('module/controller');  // 模块名/控制器名
$cont->function($params); // 控制器下的function 并传入参数即可

但是上面的方式存在一个问题,就是跨模块调用的时候,在被调用的控制器的里面使用model的时候,如果更新的时候,使用如下代码会出现一个问题:

$rs = (new Model)->save($data,$condition); //提示save方法不不存在
那就需要使用地下的方式:

$rs = $model
         ->allowField(true)
         ->isUpdate(true,['out_trade_no'=>$out_trade_no])
          ->save(['status'=>1,'pay_time'=>time()]); // 亲测有效
个人的总结,如果有不对的地方,还望不吝指出,感谢

我的微信:graent_hu

欢迎扫码加我和微信好友,有什么问题我们可以一起探讨,有什么需要也随时欢迎发消息给我~

转载请注明出处:

本文标题:ThinkPHP5垮模块调用控制器使用controller的方法

本文链接:https://www.wlyc.cn/post-177.html

发表评论

路人甲 表情
看不清楚?点图切换