0%

weiphp中插件模型调用

起源

在写了weiphp队列插件之后,由于将所有的数据操作放入到模型中,一开始直接用M()方法 调用model.class.php内置方法没有问题,但是用我在QueueModel.class.php中写好的方法是出现了问题。所以写了这篇文章来讲述weiphp中如何调用D()方法。

插件调用方式

插件有两种调用方式,一种是curl请求,另一种是直接初始化QueueController类。
curl请求有可能会遇到用户登陆跳转,所以被我否定了。我才用了第二种直接new一个QueueController类。

问题来了

使用方式在QueueController类的delQueue方法中使用

1
2
$queueModel = D( $this->model['name']);
return $queueModel->delQueue($data);
  1. 当我们在Queue插件内部调用的时候,发现D('Queue')返回的结果是正确,对象的名称是object(Addons\Queue\Model\QueueModel)
  2. 当我们在其他插件里面或者模块中使用new QueueController方式调用时,发现D('Queue')返回的结果是不正确,对象的名称是object(Think\Model)

    分析原因

    在Queue插件中调用时,D()方法默认寻址,能够在Addons\Queue命名空间下搜到Addons\Queue\Model\QueueModel.class.php
    而在其他插件或者外部时,D()方法搜索的在Addons\其他插件名其他模块名的命名空间下搜不到Addons\Queue\Model\QueueModel.class.php 首先就是因为命名空间不对,其次也是根据命名空间规则处理方式,在其他插件目录或模块下找不到QueueModel.class.php

    解决办法

  3. new Model时使用new 命名空间\xxxModel()来做,这是使用了PHP命名空间后的建议方式。
  4. thinkphp框架中,除了1中的方式,还可以用另一种方式类似
    1
    2
    //实例化Extend扩展命名空间下的Info模型
    D('Extend://Editor/Info');
    比如Queue插件下我们可以这样用D('Addons\Queue\Queue')手册地址传送门 看D方法实例化。解析方法其实是一个叫做parese_res_name()的函数。

总结

我们在使用了

1
2
3
4
5
6
7
$queueController = new  \Addons\Queue\Controller\QueueController();
$queueController->addQueue([
[
'target_table'=>'wangka_order',
...
]
]);

之后在QueueController内部使用D('Queue'),跟在当前控制器中使用D('Queue')是一样的,因为D()方法调用的各项环境变量都是当前控制器的并不是QueueController的。这是由于D()方法的封装理念所决定的。

  • Post author: hainuo
  • Post link: weiphp-model-addons
  • Copyright Notice: All articles in this blog are licensed under BY-NC-ND unless stating additionally.